Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Duvidas ao inicializar variaveis

Olá, gostaria que me ajudassem a entender pq quando eu inicializo a variável fora do FOR e ela é igual a um, o código roda normalmente.


#include<stdio.h>
int main(){
    printf("ESSE PROGRAMA CONTA ATE CEM\n");
int i = 1;
    for(i<100;i++;){
        printf("%d\n",i);

        if (i == 100){

            break;
        }
    }
}

mas caso meu I seja inicializado com 0 (i=0) o código não roda, no caso apenas imprime a frase do primeiro printf do programa.


#include<stdio.h>
int main(){
    printf("ESSE PROGRAMA TE AJUDA A CONTAR ATE CEM\n");
int i = 0;
    for(i<100;i++;){
        printf("%d\n",i);

        if (i == 100){

            break;
        }
    }
}

Outra duvida que tenho, é que, por que quando eu não inicializo o i dentro do for, eu preciso colocar ponto e vírgula (;) no i++, e quando inicializo não tenho essa necessidade?

2 respostas
solução!

Há um erro semântico na tua estrutura do laço, o qual, infelizmente, não impede a compilação do código.

A estrutura de um laço for é :

for (inicialização; teste; incremento)

Sempre nessa ordem. Caso uma das etapas não seja necessária, pode ser deixada em branco, mas a estrutura tem de ser obedecida. Por exemplo:


// loop sem inicialização
for ( ; i < 100; i++) {
}

// loop sem teste
for (int i = 0; ; i++) {
}

// loop sem incremento
for (int i = 0; i < 100; ) {
}

// loop infinito
for ( ; ; )

são todas formas perfeitamente válidas de utilização.

No teu código o teste está na posição da inicialização, o incremento no teste, e o incremento vazio. Funciona acidentalmente porque o if quebra o laço. Mas a semântica está errada.

Quem está iniciando a aprender a programar pode não se dar conta deste detalhe, mas o ';' é um token muito importante para o parser do compilador, pois delimita os statements do programa.

Um laço for é uma forma compacta de realizar 3 statements distintos, inicialização de variável, teste de condição, incremento, por este motivo tem-se de utilizar o ';', para que o compilador saiba quando uma operação começa e outra termina.

É o único mecanismo possível para isso? Não, outras linguagens possuem gramáticas distintas, mas em C essa foi a decisão tomada pelos projetistas.