2017-03-21 57 views
-3

我在某處發現了此問題並無法理解它。這個你能幫我嗎。C中的異常數學運算

#include<stdio.h> 

    int main(){ 

    char x = 250; 

    int ans = x + !x + ~x + ++x; 

    printf("%d", ans); 


} 

輸出結果爲-6。我不明白編譯器如何執行操作。

在此先感謝!

+1

如果'char'簽署,注意'250'超出範圍,但可能是'-6'。但沒有序列點的'++ x'使它*未定義行爲*。儘管 –

回答

0

當你試圖瞭解這樣的事情,它往往有助於下來把問題分解成更小的碎片,並期待在每一個。我修改程序,使其打印每個值:

#include<stdio.h> 

int main(){ 

    char x = 250; 

    printf("x: %d\n", x); 
    printf("!x: %d\n", !x); 
    printf("~x: %d\n", ~x); 
    printf("++x: %d\n", ++x); 

    int ans = x + !x + ~x + ++x; 

    printf("ans: %d\n", ans); 
} 

和輸出我得到當我運行它是:

x: -6 
!x: 0 
~x: 5 
++x: -5 
ans: -5 

一旦你瞭解每個部分的手段,它更容易看到它們如何組合成最終結果。然而,我的編譯器還發出警告,因爲++x在其他地方使用x相同的表達改變x,並改變其中的項進行評估將改變最終結果的順序。

+1

這個建議是有幫助的,你的答案給出了操作的混合描述定義的行爲的印象。它沒有(至少不是在不規律地結合時)。 – byxor