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?

Foi útil?

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.

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