未定義動作
ISO/IEC 14882:2003(E): Programming Languages - C++ §5.7 Additive operators [expr.add] para. 5
↑ ISO/IEC (2003). ISO/IEC 14882:2003(E): Programming Languages - C++ §5.9 Relational operators [expr.rel] para. 2
↑ ISO/IEC (2007). ISO/IEC 9899:2007(E): Programming Languages - C §6.9 External definitions para. 1
↑ ANSI X3.159-1989 Programming Language C, footnote 26
↑ “Order of evaluation - cppreference.com”. en.cppreference.com. 2021年5月21日閲覧。
↑ ISO/IEC (1999). ISO/IEC 9899:1999(E): Programming Languages - C §6.5 Expressions para. 2
特定の種類のポインタ操作は、未定義動作を引き起こす可能性がある。
CおよびC++では、オブジェクトへのポインターの比較(大小比較)は、ポインターが同じオブジェクトのメンバーである、もしくは同じ配列の要素を指している場合にのみ厳密に定義される。
return文に到達することなく値を返す(main()以外の)関数の終わりに到達すると、関数呼び出しの値が呼び出し元によって使用される場合、未定義動作が発生する。
2つのシーケンスポイント(英語: sequence point)の間でオブジェクトを複数回変更すると、未定義動作が発生する。C++11の時点で、シーケンスポイントに関連して未定義動作を引き起こす要因にはかなりの変更が行われたが、次の例では、CとC++の両方で未定義動作が発生する。
2つのシーケンスポイントの間でオブジェクトを変更する場合、格納する値を決定する以外の目的でオブジェクトの値を読み取ることも、未定義動作となる。
CとC++では、値のサイズ以上のビット数、あるいは負の数だけビットシフトすると、未定義動作が発生する。 ここで、コンパイラに関係なく最も安全な方法は、シフトするビット数(<<および>>ビット演算子の右オペランド)を常に0からsizeof(value)*CHAR_BIT - 1 までの範囲内にしておくことである。(ここで、valueはビット演算子の左オペランドである)