簡體   English   中英

意外的C行為

[英]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.

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