2011-12-02 45 views
0

由於'?'的關聯性,是從右到左,任何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

您的評價順序錯誤。在a ? b : c中,總是先評估a,然後評估bc

我已經標記了自己的例子,這樣我可以識別的子表達式:

  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; 
} 
+0

所以,它就像正常的條件thingy ....在哪裏的結合?正在使用....爲什麼不應該按照從左到右的方式完成,如a = b = c = 5? – nikel

+1

我不明白你的問題。 Associativity指定一個操作符的多個實例如何分組。然而,這裏並不重要:「一個? b? c:d:e'不能以任何方式解析,除了'a? (b?c:d):e'(絕對沒有其他方式可以形成有效的表達式)。該規範指出,在'一個?b:c',先評估'a',然後評估'b'或'c'。因此,行爲就像我在答案中所描述的那樣。 –

+0

得到你...通常閱讀,以這種方式a = b = c = 5 ..因爲=的結合是從右到左,c = 5被執行早先...這導致了一個概念,即關聯性定義了exec的順序現在它很好,結合性定義了分組以形成一個實體....謝謝:) – nikel

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 
    } 

希望這有助於!

+0

in a = b = c = 5;它從左到右執行爲a =(b =(c = 5))right ...爲什麼我的問題的上下文不能從右到左執行?爲什麼使用最初的'x'值? – nikel

0

您的問題的答案是在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; 

希望這有意義了。

+0

你認爲?作爲一個序列點? – nikel

+0

是'?'被認爲是序列點 – havexz