2012-03-15 7 views
1

次のコードプリントC及びC++コンパイラ(gcc 4.1.2)次のコードはC/C++でどのようにコンパイルされますか?

int x = 10; 
-x; 
cout << -x << endl; // printf("%d\n", -x); 

両方-10。 2行目のコンパイルエラーが予想されました。 それは何か基本的なものかもしれませんが、私はその行動を理解していません。誰か説明してもらえますか?

ありがとうございます。

+2

'-x;'はxを否定し、結果を破棄します。例えば ​​'x + 1;と同じです。 – Anycorn

+3

この場合、コンパイラは効果がないので式全体を最適化する可能性が高いことに注意してください。実際には、私はまともなコンパイラがそのような声明の不自然さについてあなたに警告すると期待します。私は-Wallを与えるとき – ereOn

+0

はい、私は警告を受ける: – Sanish

答えて

11

ステートメントは式にすることができます。そのようなステートメントは、式の結果を破棄し、その副作用の式を評価します。

-x;は、否定をxと計算し、結果を破棄します。

詳細については、[stmt.expr]をC++標準でお読みください。

+0

おかげ。 – Sanish

1

-x;を実行すると、変数にoperator -が実行されます。
演算子は否定の値を返しますが、オブジェクト自体は変更しません。

演算子の結果を保存しないため、x自体の値は同じです。

あなたはcout-xを印刷するとき、あなたは代入文、またはプロシージャ呼び出し文を持っていません++ operator <<

+0

'オペレータ'内蔵例えば 'int'などのタイプに使用されていないの[stmt.expr]を指すため' G ++ -Wall -Wextra -Werror .cpp' – Pubby

1

Cに返されoperator -の結果を参照してください。 これは、代入を式の演算子として定義し、側面には のエフェクトがあり、式文を持っています。式ステートメントの 最上位演算子は、 の効果—を持っており、代入演算子 のように状態を変更するか、関数を呼び出すことが期待されています。しかし、言語はそれを必要とせず、完全に正当なものであれば副作用のない式文である です。

良いコンパイラますこのような場合に警告を出力し、それは確かにほとんど プログラマのエラーだ(といくつかの理由のためにあなたが 、このようなAをしたい場合は、通常、明示的voidに結果をキャスト による警告を遮断することができるので、ステートメント— assertマクロでこれを行うことがよくあります)。

0

2行目はxには影響しませんが、計算されます。第3はxには影響しませんが、計算された出力は標準出力std::coutに送信されます。ビット単純な物事を理解するようにするには:

int x=10; 
std::cout << x-10 << std::endl; 
std::cout << x << std::endl; 

意志出力と。

関連する問題