2016-06-25 6 views
-2

Мой вопрос заключается в том, что в программе ниже, как делает код, как это работает: в то время как (зсапЕ ("% d% d", & а, и б), (а || Ь))

while (scanf("%d %d", &a, &b), (a || b)) 

оценивается?

Программа получить два числа и напечатать сумму:

int a, b; 
while (scanf("%d %d", &a, &b), (a || b)) 
    printf("%d\n", a + b); 
+0

C и C++ разные языки, поэтому, пожалуйста, помечать ваш вопрос правильно –

+3

Параметр '|| b' - это управление контуром, но программа не выполняет основную проверку возвращаемого значения из 'scanf'. –

+0

Да, я знаю, что C и C++ - разные языки, но вопрос, который я задал, является общим для обоих из них – vishal

ответ

1

Программа имеет логическую ошибку - ввод меньше, чем два числа и закрытия потока сделает программа идти в бесконечный цикл. Если вы закроете поток на первой итерации, вы также получите неопределенное поведение, потому что 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 не равен нулю.

2

Подробнее о документации C и его standard library.

Начинать с чтения тщательно документации scanf.

Тогда читайте о comma operator, и logical operators (например || и &&)

Кроме того, скомпилировать код со всеми предупреждениями & отладочной информации (gcc -Wall -g) и запустить его шаг за шагом в отладчике (gdb). Это даст вам некоторую (частичную) интуицию о том, как ваш компьютер запускает ваш код.

Не забудьте прочитать о undefined behavior, в частности в блоге C.Lattner: What every C programmer should know about undefined behavior.

Лучше код может быть:

int a, b; 
while ((a=b=0), (scanf("%d %d", &a, &b)==2) && (a || b)) 
    printf("%d\n", a + b); 
0

, как он работает:
, если пользователь вводит два целых числа будет печататься сумма этих двух чисел,
и попросить два ввода следующего, пока пользователь не введет два нулевых целых чисел,
и если пользователь вводит не целое значение, как aaa он будет печатать предыдущие значения a+b и петли навсегда без запроса нового ввода!

так что плохой код:

  1. пытаются писать как можно проще (нет никакого смысла в объединении операторов Си)
  2. всегда проверять на наличие ошибок
  3. использование системы независимых типов, таких как int32_t от #include<stdint.h> при необходимости
  4. инициализировать переменные

мой рекомендуемый образец:

#include<stdint.h> 
#include<stdio.h> 
int main() 
{ 
    int32_t a, b; 
    do{ 
     if (scanf("%d%d", &a, &b) != 2) { 
      printf("incorrect input\n"); 
      return 1; 
     } 
     printf("%d + %d = %d\n", a, b, a + b); 

    } while (a || b); 
    return 0; 
} 

выходной терминал (+ вход):

10 
20 
10 + 20 = 30 
0 
0 
0 + 0 = 0 
Смежные вопросы