コンマオペレーターとボイド式
-
28-10-2019 - |
質問
このコードスニペットに出会いました 1
int return_printChar1()
{
// code
// oops! no return statement
}
int return_printChar2()
{
// code
return printf("Return");
}
int main()
{
int i;
// some more code
i = return_printChar2();
if((return_printChar1(),i))
{
printf ("Gotcha");
}
}
1:これは実生活の例ではありません。
私の質問は "コードスニペットの動作は、CおよびC ++で明確に定義されていますか?"
私のテイク:
Cでは、動作は明確に定義されています 6.5.17
言う
コンマオペレーターの左オペランドは、 空白式;評価後、シーケンスポイントがあります
C ++ 03では、動作は明確に定義されています。 5.18
言う
コンマによって区切られた式のペアが左から右に評価され、左式の値は 廃棄されました.
ただし、C ++ 03(セクション内 6.6.3
)またそう言います
関数の端から流れることは、価値のない返品と同等です。これにより、価値回転関数の未定義の動作が生じます。
同様にcで
コントロールが端に達した場合(
}
)非void関数(を除くmain()
)動作は未定義です。
したがって、これらすべてのポイントを考慮に入れて、実際の行動を判断することはできません。人々はどう思いますか?
PS:質問が役に立たないと思うなら、あなたがやるべきことがもっと良いと思うなら、あなた自身を助けてください:D。
解決
私が持っているC仕様(C99 TC3)は言う
関数に終了する}が到達し、関数呼び出しの値が発信者によって使用される場合、動作は未解決です。
「ボイド式として評価される」と言われている式の値は破棄されます。したがって、Cの場合、未定義の動作はありません。古いCでは異なっていた可能性があります(正しく覚えていれば、いくつかの詳細があります)。
C ++は、C ++がコンストラクターとデストラクタを持つクラスオブジェクトを戻り値としてサポートし、それらを非初期化されたメモリで動作させることはうまく機能することは保証できないため、C ++の状況はCの場合はわずかに異なります。おそらく、これはC ++のさまざまなルールに貢献したのでしょう。
他のヒント
それは未定義の動作です。
左の式の評価は、戻ることなく価値回転関数の終わりから流れ出ることになります。値が破棄されているからといって、評価が決して起こらなかったわけではありません。
それは明らかに未定義です。 C99§6.3.2.2は、「(その副作用については空白式が評価されます。)」と述べています。刑務所の無料カードから抜け出すことはありません。