Программа имеет логическую ошибку - ввод меньше, чем два числа и закрытия потока сделает программа идти в бесконечный цикл. Если вы закроете поток на первой итерации, вы также получите неопределенное поведение, потому что a
или b
будут прочитаны перед записью.
Причина этого заключается в том, что comma ,
operator отбрасывает результат вычисления своего первого операнда:
while (scanf("%d %d", &a, &b), (a || b))
будет вызывать scanf("%d %d", &a, &b)
и приступить к оценке a || b
независимо от результата. Это неверно, потому что scanf
может вернуть указание, что поток закончился до чтения двух целых чисел.
Лучший способ написания этой программы заключается в следующем:
while ((scanf("%d %d", &a, &b) == 2) && (a || b))
Это также более интуитивным, потому что &&
выделяется лучше, чем запятая.
Примечание:a || b
означает то же самое, что и a != 0 || b != 0
, то есть, что по крайней мере один из a
или b
не равен нулю.
C и C++ разные языки, поэтому, пожалуйста, помечать ваш вопрос правильно –
Параметр '|| b' - это управление контуром, но программа не выполняет основную проверку возвращаемого значения из 'scanf'. –
Да, я знаю, что C и C++ - разные языки, но вопрос, который я задал, является общим для обоих из них – vishal