2015-10-21 2 views
3

я написал небольшой тестовый код:Проблема с функцией CIN в C++ язык

#include <iostream> 
using namespace std; 

int main() { 
    int a,b,c,d; 
    cin>>a>>b,c>>d; 
    cout<<a<<" "<<b<<" "<<c<<" "<<d; 
    return 0; 
} 

я дал вход:

1 2 3 4 

и выход:

1 2 0 0 

но из моего следует дать некоторую ошибку из-за cin>>a>>b,c

Почему этот код не дает ошибок?

+1

Запятая - это оператор, но делает что-то очень отличное от '>>'. Вы ошибаетесь, ожидая, что он даст ошибку, потому что это действительный оператор. – Peter

+1

Вы должны проверять предупреждения компилятора. Он должен рассказать вам об использовании неинициализированных переменных, которые помогут вам определить, что происходит. – juanchopanza

+1

По крайней мере, вы получаете очки за копирование и вставку фактического кода, который показал опечатку, вместо того, чтобы просто поднять вопрос. – Gorpik

ответ

4

запятая оператор, >> между целыми числами является оператором сдвига (cin использует перегруженную версию этого оператора). так что ваш код эквивалентен:

cin>>a>>b; 
c>>d; 

обе линии являются действительными, вы просто не обращая внимания результат второй операции

+0

И вторая операция вызывает неопределенное поведение. – juanchopanza

2
cin>>a>>b,c>>d; 

должно быть:

cin>>a>>b>>c>>d; 

не дал какую-либо ошибку, потому что компиляторы принимает ваше выражение, как:

cin>>a>>b; 
c>>d; // bit-wise shift operator 
3

Согласно comma operator:

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

Так что ваш код cin>>a>>b,c>>d; эквивалентно:

cin>>a>>b; 
c>>d;  // built-in bitwise shift operator. Note c and d isn't initialized yet. 

, который хорошо сформированным.

1

Запятая является действительным оператором, она отделяет выражения, которые выполняются один за другим, возвращая результат влево-самое в качестве значения.

Итак:

a = b, c = d; 

эквивалентно:

a = b; 
c = d; 

Так что в вашем случае, если вы делаете два отдельных, но действительные вещи:

cin >> a >> b, c >> d; 

эквивалентно:

cin >> a >> b; 
c >> d; 

c >> d - действительная операция двоичного сдвига между целыми числами.