由於'?'的關聯性,是從右到左,任何2個連續的'?'運營商必須如此對待,對嗎?C中的關聯性和序列點
現在,
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.Where零難道我錯了嗎?
由於'?'的關聯性,是從右到左,任何2個連續的'?'運營商必須如此對待,對嗎?C中的關聯性和序列點
現在,
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.Where零難道我錯了嗎?
您的評價順序錯誤。在a ? b : c
中,總是先評估a
,然後評估b
或c
。
我已經標記了自己的例子,這樣我可以識別的子表達式:
c
int y=x?x++?x:-1:1;
a bbbbbbbb
(一)評估,產生-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
}
希望這有助於!
in a = b = c = 5;它從左到右執行爲a =(b =(c = 5))right ...爲什麼我的問題的上下文不能從右到左執行?爲什麼使用最初的'x'值? – nikel
您的問題的答案是在C/C++ 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;
希望這有意義了。
所以,它就像正常的條件thingy ....在哪裏的結合?正在使用....爲什麼不應該按照從左到右的方式完成,如a = b = c = 5? – nikel
我不明白你的問題。 Associativity指定一個操作符的多個實例如何分組。然而,這裏並不重要:「一個? b? c:d:e'不能以任何方式解析,除了'a? (b?c:d):e'(絕對沒有其他方式可以形成有效的表達式)。該規範指出,在'一個?b:c',先評估'a',然後評估'b'或'c'。因此,行爲就像我在答案中所描述的那樣。 –
得到你...通常閱讀,以這種方式a = b = c = 5 ..因爲=的結合是從右到左,c = 5被執行早先...這導致了一個概念,即關聯性定義了exec的順序現在它很好,結合性定義了分組以形成一個實體....謝謝:) – nikel