簡體   English   中英

與賦值表達式的C ++比較是右側表達式

[英]C++ comparison with an assignment expression be the right hand side expression

我目前正在處理使用C ++的數據結構問題。 我將檢查單鏈表中的節點是否按升序排序。 這里有我的代碼的一些細節

Node.cpp

class Node
{
   public:
     double data;       
     Node* next;    
};

對於問題發生的部分,

double preValue = sLL.head->data;       
Node *curNode = sLL.head->next;     

    do
    {
        if (preValue > (preValue = curNode->data))  // Problem occur in this line   
            return false;
    }while (curNode = curNode->next);

由於'>'運算符的評估順序是評估左側表達式然后右側表達式

賦值運算符將返回左值的引用。

因此, preValue > (preValue = curNode->data)應比較最后一個節點和當前節點,並在完成比較后分配下一個節點的數據。 因此,我認為我的實施應該是有效的。

然而,結果if(preValue > (preValue = curNode->data))是我的預料,一比較時的preValue比新的更大的preValue ,它一直返回false。

我試圖打印出if語句的返回值,只要左表達式大於或小於右表達式,它總是返回0。 我不明白為什么會這樣。 誰能告訴我我犯了什么錯誤?

ps該程序可以正常使用以下實現

double preValue = list.head->data;      
Node *curNode = list.head->next;            

do
{
    if (preValue > curNode->data)       // Check ascending order
        return false;

    preValue = curNode->data;

}while (curNode = curNode->next);       

這一行是未定義的行為:

if (preValue > (preValue = curNode->data))  // Problem occur in this line

因為您要分配給變量( preValue )並從同一個變量讀取 ,並且讀取不用於確定寫入的值

來自C ++03§5/ 4 [expr]

[...]在前一個和下一個序列點之間,標量對象的表達式評估最多只能修改一次存儲值。 此外,只能訪問先前值以確定要存儲的值。 對於完整表達式的子表達式的每個允許排序,應滿足本段的要求; 否則行為未定義。

序列點出現在完整表達式(即以分號結尾的表達式或語句)之后,以及在&&||的第一個操作數之后。 ?: ,和,運營商。 所有其他運算符(包括>運算符)在其參數的求值之間沒有序列點。 序列點也出現在與此問題無關的其他幾個地方。

正如您所說,修復方法是將其拆分,以便賦值在比較的單獨語句中進行。

當我使用-Wall編譯器標志使用GCC編譯此代碼時,我收到此警告:

warning: operation on ‘preValue’ may be undefined [-Wsequence-point]

我強烈建議您始終使用-Wall-Werror編譯,以便編譯器立即標記這些錯誤,您可以更正它們。

這條線

if (preValue > (preValue = curNode->data)) 

是一種未定義的行為。 請參閱序列點的概念。 表達式只能在兩個序列點之間修改其對象一次,而“>”不是序列點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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