簡體   English   中英

C中的關聯性和序列點

[英]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 : 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;
}

操作方式:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM