2016-12-25 6 views
4

私はこのC++の関数が何をするのかを理解し、私はreturn文はこのよう書かれている理由を理解していない:このリターンステートメントでこのコンマを使用する理由は何ですか?

int intDivide(int num, int denom){ 
    return assert(denom!=0), num/denom; 
} 

が一つだけ;があるので、ステートメントが1つだけ、ここですが、カンマが私を混乱させる。なぜ書かないのですか:

int intDivide(int num, int denom){ 
    assert(denom!=0); 
    return num/denom; 
} 

最初のバージョンでは、「エレガンス」とは何かがありますか?

カンマはとにかく何をしているのですか?基本的に上記の2つのバージョンが同一であるように、1つのステートメントを2つの部分に分割しますか?

+0

これは有効な構文ではありません。それは私が意図的にやり遂げることを避ける(あなたの期待通りに動作すると仮定して)奇妙なもののように見えます。 – byxor

+2

組み込みコンマは、各式を評価し、最後の式の結果を返します(つまり、評価する式が過負荷になっていないと仮定すると、すべての地獄が緩んでしまう)。どのように移植性が高いのか分かりません。なぜなら、assertマクロが何を定義するかに大きく依存するからです。 – StoryTeller

+2

私が考えることができる最初のスニペットのように書かなければならない唯一の正当な理由は、C++ 11の 'constexpr'です。 –

答えて

0

5.19コンマ演算子左から右 [expr.comma]
コンマ演算子群。カンマで区切られた式のペアが 左から右に評価され

expression: 
    assignment-expression 
    expression , assignment-expression 

。左の式は破棄された値 式(第5項)です。 すべての値の計算と副作用 は左の式に関連付けられ、すべての値が計算されて右の式に関連付けられた副作用が発生する前に順序付けられます。結果の型と値は オペランドの右の型と値です。その結果は右辺の オペランドと同じ値カテゴリに属し、その右オペランドがglvalueであればビットフィールドであり、 ビットフィールドである。右側のオペランドの値が一時的(12.2)の場合、 の結果は一時的です。

はい、@StoryTellerがコメントしたように、カンマ演算子がオーバーロードされている場合を除き、2つのバージョンは同じです。

1

これは「構文糖」の一種で、similar questionに展開されています。

基本的にe1, e2は、e1を評価し、次にe2を評価し、その全体がe2の結果であることを意味します。私の意見では、あなたが示唆したものを書くのは難しく、難解です。たぶん、作家はコードラインで安いでしょう。 C++標準から

5

constexprのコードは使用されていませんでしたが、C++ 11 constexprの関数には、returnという文が1つのみ含まれていました。非機能アサーションを行い、値を返すには、カンマ演算子を使用する以外の方法はありません。しかし、C++ 14では、この制約は削除されました。

私は機能はもともと組み込みのコンマ演算子は、単に2つの式をシーケンスこの

#define INT_DIVIDE(nom,denom) (assert(denom != 0), nom/denom) 

のようなものを読んで、マクロから書き直されたことが想像できます。式の結果は第2オペランドです。 2つの関数は、実際には等価です。コンマ演算子にオーバーロードされることに注意してください。そうであれば、式は順序付けされず、結果はオーバーロードが定義するものである。

実際には、コンマ演算子は時には非常に便利です。たとえば、パラメータパックを展開するときにコンマ演算子を使用するのはよくあることです:それぞれの展開で値を生成する必要があり、void結果が混乱するのを避けるためには、カンマ演算子を使用して値。例:

template <typename... T> 
void g(T const& arg) { 
    std::initializer_list<bool>{ (f(arg), true)... }; 
} 
+0

'f'がオペレータを過負荷にする問題のある型を返す場合にのみ使用される組み込みコンマ演算子であることを確認するために、通常' void(f(arg)) 'を使用します。 – StoryTeller

関連する問題