Dentro de um loop de um tempo, a última declaração separada por vírgula é garantida para a última vez?
-
28-09-2019 - |
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?
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.