![](/img/trans.png)
[英]C# Pointer: error CS0254: The right hand side of a fixed statement assignment may not be a cast expression
[英]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.