プログラミング言語Cの次期仕様C2yに向けて、式の評価順序を厳格に規定する提案 N3203 Strict order of expression evaluation が提出されている。チャレンジングなお話。
C言語(C++も同様)では歴史的経緯から、演算子オペランドの評価順*1や関数実引数リストの評価順(→id:yohhoy:20120304)は規定されておらず、任意の順序で実行される可能性がある。*2
C/C++以降のプログラミング言語では演算子オペランドや関数実引数リストの評価順「左→右」と保証されており、本提案がC言語に採用されれば未規定(unspecified)動作や未定義動作(undefined behavior)の回避に大きく貢献するはず。いや、でも厳しそうだなぁ...
int f() { puts("f"); return 1; } int g() { puts("g"); return 2; } void h(int, int) {} int a = f() + g(); // a==3 // C23: 標準出力は f→g / g→f 順のいずれか // N3203: 必ず f→g の順を保証する h( f(), g() ); // C23: 標準出力は f→g / g→f 順のいずれか // N3203: 必ず f→g の順を保証する
関連URL