[英]Associativity and Sequence Points in C
由於“?”的關聯性 是從右到左,連續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上顯示為零。我在哪里錯?
您的評估順序有誤。 在a ? b : c
a ? b : c
, a
總是先進行計算,然后或者b
或c
進行評價。
我已經標記了您的示例,以便可以標識子表達式:
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;
}
操作方式:
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
}
希望這可以幫助!
您的問題的答案是在C / C ++中int y = x ? (x++?x:-1) : 1;
int y = x ? (x++?x:-1) : 1;
我們將到達兩個序列點?
。 在序列點結束后,對變量進行任何更新操作都將生效。 因此,讓我們來看一下我們的示例。
第一個序列點是第一個?
從左。
x=-1; (Actual Value)
x=-1; (Value used in expression)
y=-1?(x++?x:-1):1;
第二個順序點是第二個?
從左。 如上所述,更新操作在序列之后是有效的,因此即使存在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;
希望這現在有意義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.