Associatividade e Sequence Pontos em C
-
27-10-2019 - |
Pergunta
Uma vez que a associatividade de '?' é da direita para a esquerda, faz 2 consecutivo '?' os operadores devem ser tratados como tal, certo?
Agora,
int x=-1;
int y=x?x++?x:-1:1;
Espero que este seja executado como:
int y = x ? (x++?x:-1) : 1;
Agora, já que seu ser executadas da direita para a esquerda, quando se deparam com o primeiro '?' na declaração, o valor de x é 0 e a expressão é tão
int y= x? 0 : 1;
daí eu esperava y ser 1, mas mostra Zero no meu dev-cpp.Where estou errado?
Solução
Você tem a ordem de errado avaliação. Em a ? b : c
, a
é sempre avaliada em primeiro lugar, então ou b
ou c
é avaliada.
Eu marquei o seu exemplo para que eu possa identificar subexpressions:
c
int y=x?x++?x:-1:1;
a bbbbbbbb
(a) é avaliada, dando origem a -1, então (b) é avaliada. Há, x++
é avaliada, originando -1 novamente, de modo (c) é avaliada. Neste ponto, x
é 0.
Ou, com mais detalhado, código mais claro, é como se você dissesse:
int x = -1;
int y;
if (x != 0)
{
int new_x = x + 1;
if (x != 0)
{
y = new_x;
}
else
{
y = -1;
}
}
else
{
y = 1;
}
Outras dicas
Operações:
Assign y to value =
if(x): --> x = -1, so true as it is non-zero
{
if(x): --> x = -1 ,so true as x will increment later due to post increment
x= x +1; --> increment x, so x = 0 . This is the value assigned. So y = 0;
else:
-1
}
else:
{
1
}
Espero que isso ajude!
A resposta à sua pergunta é que em C / C ++ int y = x ? (x++?x:-1) : 1;
vamos acertar dois pontos de seqüência no ?
. Todas as operações de actualização a variável com um ponto em sequência será eficaz após essa sequência é longo. Então, vamos olhar para o nosso exemplo na mão.
Primeiro ponto seqüência é primeiro ?
da esquerda.
x=-1; (Actual Value)
x=-1; (Value used in expression)
y=-1?(x++?x:-1):1;
Segundo ponto sequência é a segunda ?
a partir da esquerda. Como mencionado acima as operações de atualização são eficazes após a seqüência de modo embora x++
está lá o valor utilizado nesta sequência é -1
e valor atualizado será usado no seguinte.
x=0; (Actual Value, bcoz of x++)
x=-1; (Value used in expression)
y=-1?x:-1;
Agora será
x=0; (Actual Value)
x=0; (Value used in expression)
y=x;
y=0;
Espero que isso faz sentido agora.