2016-08-26 18 views
-3

C++では、代入文や関数呼び出し文などはありません。関数呼び出し=式 - 文... void型の関数でさえも?

割り当ては式です。 function-callは式です。これはBjarne Stroustrupの書籍「」「C++プログラミング言語」でまっすぐに来ています。

私は式が値を計算することを知っています。これは、値が返されないので、これがvoid関数に適用されるかどうか疑問に思います。

戻り値の型がの関数voidがまだ式としてカウントされているかどうかを知りたいのですが、その場合、なぜですか?

+2

私は先に進み、あなたの質問から無関係のチャタリングを減らし、少し構造化しました。 –

+1

C++標準:* 1式は、値の計算、オブジェクトまたは関数を指定する**または**、副作用を生成する**または**、**または**の計算を指定する演算子およびオペランドのシーケンスですそれらの組み合わせを実行する*(私の強調)式が必ずしも値を計算するとは限らないことに注意してください。しかし、特定の表現はそうします。 –

+0

[C++でのステートメントと式の違いを説明する]の重複の可能性があります(http://stackoverflow.com/questions/27600153/explaining-the-difference-betweena-a-statement-and-an-expression-in- c) –

答えて

1

はい値が返されない関数(戻り値はvoidと宣言されています)は、呼び出したときでも式としてカウントされます。これは、他の式での使用を制限します。たとえば、そのような呼び出しは代入のどちらの側にもできません。

「理由」は?関数呼び出しは関数呼び出しです。値を返さない関数の特別なルールを追加すると、言語の設計がずっと複雑になります。 C++にはすでに十分な特別な規則と例外があります。

1

C++14 standard:

§5式:

1発現 計算を指定する演算子およびオペランドの配列です。表現結果が値とでき原因側 効果

になるように、発現の「メイン」の目的/範囲は、値を計算するのではなく、計算を指定することであることができます。計算の中には値があり、あるものは副作用があるものもあります。

これに加えて(実際にはまず第一に)、「式」と「文」がCとC++の文法を定義するのに使われます。 "式"ではなく値を返さない関数を作ることは構文上不可能です。意味のレベルでその区別を加えることは、不必要に過度に複雑になる。

+0

うわー。私が持っているリファレンスマニュアルは古く、約50ページしかありません。そのPDFはスティーブンキングの小説のようなものであり、明確な方法で概念を説明するのではなく、すべてを不必要に複雑にするようになっているようです。 –

+0

@j_burks pdfはマニュアルではありません。これは公式のC++標準です。それは初心者に物事を説明するためのものではありません。これは、C++の形式的、完全かつ明白な方法で定義されたドキュメントです。それはC++コンパイラと標準ライブラリが基づいているリファレンスです。 – bolov

0

はい、void関数呼び出しも式です。 C++標準で定義は言う:

表現が 計算を指定する演算子とオペランドのシーケンスです。式は、結果としての値になり、は、の側に の効果を引き起こす可能性があります。

関数呼び出しは、関数の引数を構成する 式の空の場合、カンマで区切られたリストを含む括弧 続いポストフィックスあります。MSDN C++言語リファレンスまた

関数呼び出しオペレータ続い後置表現、()、 は関数呼び出しを指定します。

0

Function Call = expression-statement ... void型の関数もありますか?

なし。

do_stuff() 

、それはexpression_optだ:関数呼び出しがこれですので、しかし、それはです。これは表現であり、声明ではありません。複合式でこの式を使用できますが、言語ロジックによる文ではありません。

あなたはすぐにそれをセミコロン与えることexpression-statementexpression_optことを変換することができます:

do_stuff(); 

は今いっぱい文です。あなたは

if(good_thing() || do_stuff()) 
{ 
    .... 
} 

do_stuff()good_thing()のようなものを考える場合

違いが明確になる/評価されることになる可能表現されています。 ()の後のセミコロンは、そのif節を壊します。

+0

しかし、do_stuff()またはgood_thing()のいずれかが戻り値の型がvoidの場合、コンパイルされません。私は式のステートメントが他のステートメント(宣言のようなもの)から分離することによって何が分かったのか分かったと思いました。たとえば、int x = int y = 5のように、左辺値に宣言文を割り当てることはできません。しかし、それは説明のためにそれをしていません。これは、何年もの間、私が "表現"と信じていたものです:一つの値を返す操作なので、値に評価されない式については混乱しました。今私は学んだことを "忘れる"必要があります。 –

関連する問題