2017-03-21 42 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

このようなことを理解しようとしているときは、問題をより小さな部分に分割し、それぞれを調べると役立つことがよくあります。あなたは各部分が何を意味するかを理解すれば、見るために簡単です、

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

:それは値の各印刷されるように、私はあなたのプログラムを修正:

#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); 
} 

をそして、私はそれを実行したときに私が手に出力されますそれらがどのように最終結果に組み合わされるかしかし、私のコンパイラは++xxを他の場所で使用する同じ式の中でxを変更しているので警告が出ます。そして、評価される順序を変更すると最終結果が変わります。

+1

このアドバイスは役に立ちますが、あなたの答えは、操作の混合が定義された動作を記述しているという印象を与えます。それは(少なくとも不当に結合されていないときは)そうではありません。 – byxor

関連する問題