2016-06-26 14 views
-3

In GCC演算子 '、'は常に第2引数を返しますか?

#include <iostream> 
int main() { 
    if(1 == 2, true) { 
    std::cout << "right" << std::endl; 
    } else std::cout << "left" << std::endl; 
    return 0; 
} 

その出力 '正しい'、それはそう常にありますか?


コンパイラは、使用されなかった左オペランドを最適化することができますか?唯一、私はリリースではこのような構成を使用することができるだろう

if(doSomethingHereWhichAlwaysReturnsTrue, 
    doSomeOtherHereAndDependOnTheResultExecuteBodyOrNot) { 
    ..body.. - execute if 'doSomeOther' returns true 
} 

このコードをデバッグです:

warning: left operand of comma operator has no effect [-Wunused-value] 
    if(1 == 2, true) { 
     ~~^~~~ 

は、私はこのようないくつかのコードを持っています。私はだと思います。


は二回聞かないために、私はまたのような連鎖を時々割り当てを使用しています:

int i, j, k, l; 
i = j = k = l = 0; 

は、それが安全なのですか?

実行順序が定義されていないと聞いたので、これは未定義の動作です。 UBとしては、コンパイラによって明確に最適化することができますが、 '-O3 -Wall -pedantic'を使用すると警告が表示されません。予想通りの結果です。ここにはの問題はありません。

+4

「2回質問しないでください」どうしてですか?異なる質問は、別々の質問投稿に行くべきです。 – MikeCAT

+0

@MikeCAT、クエリを集約するちょうど合理的な習慣 –

+1

2つの質問はお互いに関連していない、彼らは別個の質問と別個の回答を受けるに値する。 – user463035818

答えて

2

C++標準の5.18は、コンマで区切られた式の

対は左から右に評価されると言います。 左の式は破棄された値の式です(第5項).86 の値計算と副次的な結果はすべて左辺の式 に関連付けられています。結果の型と値は、 型と右オペランドの値です。結果は右のオペランドと同じ値 カテゴリのものであり、右のオペランド がglvalueとビットフィールドの場合はビットフィールドです。右オペランドの値が 一時的(12.2)の場合、その結果は一時的です。

したがって、標準によれば、第2オペランドの値を返すのは予想される動作です。

ただし、you can overload comma operatorとなります。この場合、返信することができます。

0

ではなく、int doubleのような基本型については正しいです。 私たちのクラスでは、演算子を上書きして演算子が返すものを決めることができます。 boostライブラリには良い例がありますが、この関数はベクトルの挿入に関するものです。

関連する問題