[英]Unexpected C behaviour
我試圖理解為什么我的程序不會編譯,
int myfunction(int x)
{
return x;
}
int main(){
int x = 10;
int result=0;
result=myfunction(x) * myfunction(++x);
printf("Result is = %d", result);
}
執行后我得到:警告被視為錯誤在函數'int main()'中:'x'上的操作可能是未定義的。 有人有想法嗎?
myfunction(x) * myfunction(++x)
未定義,因為未指定對operator *
的兩個參數的求值順序。 因此,可以首先執行第一次或第二次調用,這意味着理論上可以首先評估x
或++x
,這可能導致不同的結果。 理論上。 在實踐中,標准只是責任你不要這樣做。
您正在使用未定義的行為。
無法保證表達式myfunction(x) * myfunction(++x)
以任何特定順序進行求值,並且由於它具有副作用,因此其行為未定義。
您的代碼使用了“未定義的行為”。
C和C ++標准沒有陳述(或定義) x
和++x
myfunction(x)
和myfunction(++x)
應該被評估的myfunction(++x)
。 你是否期望結果是121或110(或者完全不是其他的) - 因為這兩個值都是完全有效的結果,你是否同樣滿意這兩個結果,或者你認為一個比另一個更“准確”?
編譯器警告您,您不能指望此代碼生成您喜歡的可能結果(可能包括您認為“不可能”的內容),以及不同的編譯器(或當前的不同設置/版本)編譯器)可能會導致不同的值。
++運算符有副作用,使語句未定義。
你可以這樣做:
result = myfunction(x) * myfunction(x + 1);
++i; /* or i++ in this case, doesnt matter */
printf("Result is = %d", result)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.