2014-11-01 4 views
1

Я видел этот кусок кода сегодня:Хотя зсапЕ с логическим оператором

while(scanf("%d %d",&x,&y),x||y) 
{ 
    .... 

Из того, что я понимаю, это входит в цикл, если некоторые из значений (х или у) истинно.

Поскольку scanf docs говорит:

В случае успеха функция возвращает количество элементов списка аргументов успешно заполненного. Этот счетчик может соответствовать ожидаемому числу элементов или быть меньше (даже нулевым) из-за соответствующего сбоя, ошибки чтения или досягаемости конца файла.

Я переписан код:

while(scanf("%d %d",&x,&y) >= 1) 
{ 
    .... 

Но на online programming challenge site первом во время работы, то второй не удается.

Я прав, исходя из своих предположений? Каковы различия между этими двумя частями кода?

(я мечение, как C++, потому что я испытал в C++ 4.8.2 - GNU C++ Compiler)

ответ

3

scanf возвращает количество аргументов, он соответствует, но фрагмент первого кода выбрасывает этот результат и только чеки чтобы узнать, соответствует ли либо x, либо y. Второй фрагмент возвращает, что вы сопоставили хотя бы одно целое число, независимо от значения.

Рассмотрите ввод "0 0". В первом случае scanf() возвращает 2, но x || y возвращает false. Во втором случае ваше условие равно true.

+0

Это был именно тот случай. Хороший улов –

0

Первый код дает while результат x||y, это правильно

Однако второй код сравнивает значение, возвращаемое scanf и 1, а затем дает while сравнивается результат.

запустите этот код, и вы будете понятны.

#include<stdlib.h> 
#include<iostream> 
using namespace std; 

int main() 
{ 
    int x, y; 
    cout<<(scanf("%d %d", &x, &y), x||y)<<endl; 
    cout<<(scanf("%d %d", &x, &y))<<endl; 
    return 0; 
} 
Смежные вопросы