2011-06-23 33 views
-1

重新打開 請投票重新打開this.It不是同一個問題,它是下面標記。 注意在這個問題中()括號也被使用過。所以使用()括號應該有一個確定的行爲。運算符優先級在C相同的邏輯不同的輸出

可能重複:
post and pre increment in c

這裏有兩個方案

計劃1

#include<stdio.h> 
int main() 
{ 
int b=5; 
int c= (b++)+(++b); 
printf("%d",c); 
} 

輸出
12

計劃2

#include<stdio.h> 
int main() 
{ 
int b=5; 
int c= (b++) + (++b) + (++b) + (++b); 
printf("%d",c); 
} 

輸出
27

我把程序2從here鏈路上的邏輯似乎是正確的,因爲對於相同的邏輯輸出 程序1的是12. 這似乎是正確的。

但是,在program2輸出中的相同解釋是27而不是29. 那麼爲什麼這種差異到來,這是我想了解的。 該鏈接的解釋有什麼錯誤?

+3

爲什麼人們如此固定,試圖使未定義的行爲發揮作用? – slezica

+0

是的,今天真是無聊的一天.... –

+0

使用圓括號並沒有什麼不同。這個問題是重複的,它是封閉的。請不要重新打開。 –

回答

3

這裏沒有運營商優先級問題。有未定義的行爲由於在b上的各種操作之間缺少序列點。

+0

請讓我知道如何將順序點放在上面的代碼中可以改善它的行爲。 –

+2

下面是如何創建序列點以消除未定義的行爲:'int c = b ++; c + = ++ b; c + = ++ b; c + = ++ b;'你可以看到,現在已經明確定義了會發生什麼。 – tomlogic

+0

@tomlogic是得到了你的觀點。不幸的是,這個問題已經結束,所以不能接受它作爲答案。 –

6

在一個表達式中不止一次增加的是Undefined Behavior™,這意味着任何事情都可能發生,包括你的編譯器編寫者來到你的房子周圍,用棒球棒擊打你的頭部,程序的輸出是一張圖片你的大腦。誰寫的內容,你鏈接到不知道他們在說什麼,這是完全錯誤的。

+0

+1藝術品授權 – grok12