Dentro de um loop de um tempo, a última declaração separada por vírgula é garantida para a última vez?

StackOverflow https://stackoverflow.com/questions/4072578

Pergunta

Considere o seguinte segmento de código (trivial):

while (i++, i <= 10) {
  // some more code
}

No caso geral, o C ++ permite que as declarações separadas por vírgulas sejam avaliadas em qualquer ordem. No caso de um loop de tempo, somos pelo menos garantidos (pela especificação) de que a última declaração (que é usada como condição para o loop) seja avaliada por último?

Foi útil?

Solução

No caso geral, o C ++ permite que as declarações separadas por vírgulas sejam avaliadas em qualquer ordem.

Se você está se referindo às vírgulas entre os argumentos da função, isso é apenas um separador.

No seu caso, você está usando o operador de vírgula, e isso introduz um ponto de sequência que garante que todos os efeitos colaterais do operando esquerdo da vírgula se acalmassem antes de avaliar o direito.

Então, sim, está bem definido.

Na seção 5.18/1 do padrão ISO C ++ 98:

Um par de expressões separadas por uma vírgula é avaliado da esquerda para a direita e o valor da expressão esquerda é descartado. As conversões LValue-para-avaliação (4.1), matriz a ponteiro (4.2) e função a ponto (4.3) não são aplicadas à expressão esquerda. Todos os efeitos colaterais (1.9) da expressão esquerda, exceto a destruição de temporários (12.2), são realizados antes da avaliação da expressão correta. O tipo e o valor do resultado são o tipo e o valor do operando correto; O resultado é um LValue se o seu operando correto for.

Outras dicas

Sim. o , O operador (a menos que sobrecarregado!) apresenta um chamado ponto de sequência e realmente garante a ordem de execução da esquerda para a direita.

Os comentários acima explicaram. E uma das maneiras comuns de abusar deste método é

while(scanf("%d", &n), n){
    // do something
}

Isso lerá o número inteiro até que lêmos o zero.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top