0

'?' の結合性から は右から左に、任意の 2 つの連続する '?' です。演算子はそのように扱われなければなりませんよね?

今、

int x=-1;
int y=x?x++?x:-1:1;

私はこれが次のように実行されることを期待しています:

int y = x ? (x++?x:-1) : 1;

右から左に実行されるため、最初の「?」に遭遇したとき。ステートメントでは、x の値は 0 であり、式は次のようになります。

int y= x? 0 : 1;

したがって、私は y が 1 であることを期待していましたが、dev-cpp でゼロを示しています。どこが間違っていますか?

4

3 に答える 3

2

評価の順序が間違っています。ではa ? b : ca常に最初に評価され、次にまたはのいずれbcが評価されます。

部分式を識別できるように、例をマークアップしました。

            c
int y=x?x++?x:-1:1;
      a bbbbbbbb

(a)が評価され、-1が得られるため、(b)が評価されます。そこで、x++が評価され、再び-1が得られるため、(c)が評価されます。この時点で、xは0です。

または、より冗長で明確なコードを使用すると、次のようになります。

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;
}
于 2011-12-02T06:14:38.637 に答える
1

オペレーション:

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
    }

お役に立てれば!

于 2011-12-02T06:15:25.577 に答える
0

あなたの質問に対する答えは、C /C++ではint y = x ? (x++?x:-1) : 1;で2つのシーケンスポイントに到達するということ?です。シーケンスポイント内の変数への更新操作は、そのシーケンスが終了した後に有効になります。それでは、手元にある例を見てみましょう。

最初のシーケンスポイントは?左から最初です。

x=-1; (Actual Value)
x=-1; (Value used in expression)
y=-1?(x++?x:-1):1;

2番目のシーケンスポイントは?左から2番目です。前述のように、更新操作はシーケンスの後に有効になるためx++、このシーケンスで使用される値はありますが-1、更新された値は次のように使用されます。

x=0; (Actual Value, bcoz of x++)
x=-1; (Value used in expression)
y=-1?x:-1;

今では

x=0; (Actual Value)
x=0; (Value used in expression)
y=x;
y=0;

これが今理にかなっていることを願っています。

于 2011-12-02T06:15:28.463 に答える