例えば、以下のようなコードがあったとします。

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_scanf0になり、
ret_scanf != 1の部分が真になるので、
n < 0 の部分でnの値がどのような値になっていて、
つまりこの部分の式の結果が真であろうと偽であろうと全体としては真になるものと思います。

つまり質問としては、
(通常動作未定義の部分を含むような式は全体においても動作未定義だと思われるが)
例のような場合、
全体としての式はやはり動作未定義ですか?
それとも動作未定義ではないのでしょうか?

ret_scanf != 1 || n < 0 とするべきとかは無しでね、例としてあげてるだけなので)