Pular para o conteúdo

Variáveis

A forma padrão de declarar uma variável exige sempre um valor inicial:

<tipo> <nome> = <expressão>;
int contador = 0;
num temperatura = 36.6;
bool ativo = sin;
textu mensagem = "Kualeh!";

Um nome de variável começa por uma letra minúscula ou por _, e depois pode ter letras, dígitos e _:

int idadi = 20;
int idadi_maxima = 120;
int _resto = 1;

Começar por maiúscula está reservado para nomes de moldes, por isso int Idadi = 20; é um erro de compilação. Os nomes também distinguem maiúsculas de minúsculas: total e totaL são duas variáveis diferentes.

O Kriol não tem variáveis por inicializar: toda a declaração leva um valor. Quando só sabes o valor mais tarde, declara a variável com um valor neutro e atribui-lhe depois:

int i = 0;
pa i = 0; i < 10; i += 1 {
mostra(i);
}
mostra(i);

O valor inicial não pode usar a própria variável, nem quando ela esconde outra com o mesmo nome num bloco exterior:

int x = x + 1; // ERRO: a variável 'x' é usada no seu próprio valor inicial
int y = 1;
si sin {
int y = y + 1; // ERRO: o 'y' de dentro ainda não tem valor
}

Uma declaração escrita fora de qualquer função cria uma variável visível a todas as funções declaradas depois dela. Serve para valores partilhados por todo o programa e para dados grandes demais para a pilha:

int contador = 0;
fn conta() {
contador += 1; // altera a mesma variável que inisiu vê
}
fn inisiu() {
conta();
conta();
mostran(contador); // 2
}

O valor inicial pode ser uma expressão qualquer, incluindo uma chamada de função. A ordem no ficheiro conta: usar uma variável de topo declarada mais abaixo é um erro de compilação, ao contrário do que acontece com as funções, que se podem chamar em qualquer ordem.

As variáveis declaradas dentro de uma função (e os parâmetros) ficam na pilha do programa, por isso cada uma pode ocupar no máximo 1 MiB (1 048 576 bytes). Um valor maior, como um array grande, deve ser declarado fora das funções:

int[200000] grandi = [0; 200000]; // 1,6 MB: fora das funções
fn inisiu() {
grandi[0] = 1;
}

Depois de declarada, uma variável pode ser reatribuída com = ou com operadores compostos:

int x = 1;
x = 5;
x += 2; // x == 7
x -= 1; // x == 6
x *= 3; // x == 18
x -= 9; // x == 9

O tipo não muda na atribuição: x = "oi"; numa variável int é um erro de compilação. Vê Conversão de Tipos para saber que valores o compilador aceita converter sozinho.

As variáveis têm âmbito de bloco { }. Uma variável declarada dentro de um bloco não é acessível fora dele:

fn inisiu() {
int a = 10;
si sin {
int b = 20; // visível apenas aqui
mostran(a); // ok
mostran(b); // ok
}
// mostran(b); // ERRO: b não existe aqui
}

Vale também para o pa: a variável declarada na inicialização do ciclo só existe dentro dele.

Um bloco interior pode declarar uma variável com o nome de outra de fora, que fica escondida até ao fim do bloco. É legal, mas raramente é o que queres: se o objectivo era mudar a de fora, escreve n = 99; sem repetir o tipo.

Os seguintes nomes não podem ser usados como identificadores de variáveis:

fn, molda, int, num, bool, textu, i8, i16, i32, i64, u8, u16, u32, u64, f32, f64, isize, usize, si, sinon, pa, nkuantu, kebra, kontinua, divolvi, mostra, mostran, toma, sai, konfirma, paniku, tenta, lansa, sin, nau, inpristan

Entre eles, mostra, mostran, toma, sai, konfirma e paniku são as funções embutidas do prelúdio: não são palavras-chave da gramática, mas o compilador não deixa redefini-las. A mensagem é clara quando tentas:

int mostra = 1; // ERRO: 'mostra' é um nome reservado do Kriol
// e não pode ser usado como nome de variável

O nome de molde Erru também está reservado, porque o tipo de erro já existe em todos os programas; vê Erros.