Eu tenho uma pergunta, como o compilador opera no seguinte código:
#include<stdio.h>
int main(void)
{
int b=12, c=11;
int d = (b == c++) ? (c+1) : (c-1);
printf("d = %i\n", d);
}
Eu não sou certo porque o resultado é d = 11
.
Eu tenho uma pergunta, como o compilador opera no seguinte código:
#include<stdio.h>
int main(void)
{
int b=12, c=11;
int d = (b == c++) ? (c+1) : (c-1);
printf("d = %i\n", d);
}
Eu não sou certo porque o resultado é d = 11
.
Respostas:
Em
int d = (b == c++) ? (c+1) : (c-1);
:c++
é o valor atual dec
11. Separadamente,c
é incrementado para 12.b == 11
é falso, poisb
é 12.(b == c++)
é falso,(c-1)
é usado. Além disso, o incremento dec
até 12 deve ser concluído neste ponto.c
é 12,c-1
é 11.d
é inicializado com esse valor, 11.fonte
De acordo com o padrão C (operador condicional 6.5.15)
Então, na expressão inicial desta declaração
a variável
b
é comparada com o valor da variávelc
porque o operador pós-incremento retorna o valor do seu operando antes de incrementá-lo.Como os valores não são iguais entre si (
b
é definido como 12 enquantoc
é definido como 11), a subexpressão(c-1)
é avaliada.De acordo com a citação, existe um ponto de sequência após a avaliação da condição do operador. Isso significa que após a avaliação da condição
c
tem o valor12
após a aplicação do operador pós-incremento à variávelc
. Como resultado, a variável d é inicializada pelo valor1
(12 - 1
).fonte
?:
. Como normalmente em C, combinar++
com outras operações no mesmo operando é um comportamento indefinido. E esse código só funciona previsivelmente porque?:
possui várias regras especiais de floco de neve.Porque a condição é falsa, portanto, o
false
caso acontecerá :,c-1
mas desde que você incrementouc
a condição emc++
, portanto,c
é agora12
. O resultado é 12-1, que é 11.EDIT: O que OP entendeu mal foi o pós-incremento.
Então, o que realmente acontece é assim:
fonte
c++
a condição. A condição é falsa, mas o valor original dec
é usado para calcularc - 1
, não a versão incrementada.c++
e++c
c++
é o operador pós- incremento. O valor dec++
é 11, com o efeito colateral de fazerc == 12
.++c
teria o valor de 12.Traduzido para uma declaração if regular, seu código ficaria assim:
A pista aqui é que c é incrementado após a condição ser verificada. Então você entra no
else
estado, mas c já tem o valor 12 lá.fonte
Consulte Operador ternário.
Sintaxe
Então você escreveu
Nessa situação, o resultado será 11 porque, após as verificações, o valor 'c' é aumentado (c + 1 = 12) e somente depois disso define o valor 'd' como c (12) -1, que é 11.
Se você usou, por exemplo:
O valor "c" seria aumentado antes de verificar a instrução, portanto seria verdadeiro e o valor "d" seria c (12) +1, que é 13.
fonte