未初期化変数を使用する部分を含む式は全体として動作未定義か?
例えば、以下のようなコードがあったとします。
int n;
int ret_scanf;
do {
ret_scanf = scanf("%d", &n);
if(ret_scanf != 1)//不正な文字があって入力に失敗した
while(getchar()!='\n');//残っている入力を消費する
} while(n < 0 || ret_scanf != 1);//負の値か不正入力があった場合繰り返す
コードの目的はint
の値を入力させて不正な入力や負の値が入力されたら再入力させるというものです。
(単なる例です、EOFの場合を考慮してないとかは無しで)
不正入力があって、n
に値が設定されなかった場合
n < 0 || ret_scanf != 1
での n < 0
の部分はn
が未初期化なので動作未定義です。
動作未定義の場合の1つ
The value of an object with automatic storage duration is used while it is indeterminate
でも入力が不正だった場合ret_scanf
が0
になり、
ret_scanf != 1
の部分が真になるので、
n < 0
の部分でn
の値がどのような値になっていて、
つまりこの部分の式の結果が真であろうと偽であろうと全体としては真になるものと思います。
つまり質問としては、
(通常動作未定義の部分を含むような式は全体においても動作未定義だと思われるが)
例のような場合、
全体としての式はやはり動作未定義ですか?
それとも動作未定義ではないのでしょうか?
(ret_scanf != 1 || n < 0
とするべきとかは無しでね、例としてあげてるだけなので)