cin как имя переменной, производящее мусорное значение

Для следующего кода:

#include<iostream>
using namespace std;
int main ()
{
       int cin;
       cin >> cin;
       cout << "cin : " << cin;
       return 0;
}

Я ожидал, что вывод будет:

cin : <input>

Но вывод:

cin : <junk value>

person Shivam Arora    schedule 27.06.2017    source источник
comment
Вот почему вы не должны использовать: using namespace std;   -  person Rama    schedule 27.06.2017
comment
Ваш пример не компилируется. Предоставьте минимальный компилируемый пример с заголовками, любыми операторами использования, вопросом и поясните, почему вы ожидаете, что результат будет таким, каким вы его ожидаете.   -  person Christopher Pisz    schedule 27.06.2017
comment
Это то же самое, что и int x; x >> x; cout << x;, что не имеет смысла. С другой стороны, std::cin >> cin будет работать.   -  person HolyBlackCat    schedule 27.06.2017
comment
@ChristopherPisz На самом деле компилируется отлично   -  person πάντα ῥεῖ    schedule 27.06.2017
comment
за этот вопрос следует проголосовать и сохранить как ссылку на то, почему никогда нельзя быть using namespace std;   -  person 463035818_is_not_a_number    schedule 27.06.2017
comment
Всем спасибо. Я понял.   -  person Shivam Arora    schedule 27.06.2017
comment
почему люди голосуют против вопроса? Я спросил что-то настолько глупое?   -  person Shivam Arora    schedule 27.06.2017
comment
Я не голосовал по этому вопросу в любом случае. Я не согласен с минусами. Но я считаю, что этот вопрос лучше задать, если бы была включена полная программа с заголовками и операторами использования. Кроме того, некоторая демонстрация исследовательской работы ослабила бы потенциальные отрицательные голоса.   -  person wally    schedule 27.06.2017
comment
@ShivamArora, пожалуйста, включите свою полную программу, чтобы у нас был MCVE, и любой ответ не является предположением   -  person Mgetz    schedule 27.06.2017
comment
@christopher Расширь кругозор своих блюд!   -  person πάντα ῥεῖ    schedule 27.06.2017
comment
Я обновил код. Приносим извинения за неудобства   -  person Shivam Arora    schedule 27.06.2017
comment
Я действительно не могу понять чрезвычайно низкий балл по этому вопросу. Это отличный вопрос. Даже без этих дополнительных строк, необходимых для компиляции, это довольно хороший вопрос.   -  person klutt    schedule 27.06.2017
comment
Я обновил свой вопрос, но количество голосов против увеличивается. Если это слишком плохо, чтобы быть вопросом, пожалуйста, проголосуйте за его удаление. Я не могу сделать это со своего конца.   -  person Shivam Arora    schedule 27.06.2017
comment
@ShivamArora Голоса идут ... Нет необходимости удалять.   -  person πάντα ῥεῖ    schedule 27.06.2017
comment
@πάνταῥεῖ : Спасибо, что уделили время и помогли мне.   -  person Shivam Arora    schedule 27.06.2017


Ответы (2)


ОК, давайте разберем ваш код (предположительно using namespace std):

#include <iostream>
using namespace std;
int main ()
{
       int cin; // Shadows the declaration of cin coming from the iostream header
       cin >> cin; // A bit shift operation on variable cin without capturing the result
       cout << "cin" << cin; // Output of the non initialized variable cin
       return 0;
}

Доказательство

person πάντα ῥεῖ    schedule 27.06.2017
comment
не могли бы вы объяснить немного больше, где я могу столкнуться с проблемами, используя using namespace std; - person Shivam Arora; 27.06.2017
comment
@ShivamArora Конечно: stackoverflow.com/questions/1452721/ - person πάντα ῥεῖ; 27.06.2017
comment
@ShivamArora Люди предполагают, что вы думаете, что cin в cin >> относится к std::cin. - person juanchopanza; 27.06.2017
comment
Как вы отвечаете на что-либо, когда нет вопроса? И почему вы предоставляете код, который не компилируется? cout не квалифицирован с помощью std:: и вы не включили ‹iostream› На любом компиляторе, поддерживающем C++11, вывод «cout»: необъявленный идентификатор. - person Christopher Pisz; 27.06.2017
comment
@ShivamArora, это действительно тебя не убеждает? Это самая большая проблема, которую я когда-либо видел, когда кто-то сталкивался с использованием пространства имен std. - person 463035818_is_not_a_number; 27.06.2017
comment
@ tobi303 Что, если в реальном коде OP нет using namespace std;? - person juanchopanza; 27.06.2017
comment
@juanchopanza это единственный способ, которым я могу представить, чтобы получить результат, о котором сообщает OP .... подождите, нет ... вы совершенно правы. Я на 99% уверен, что исходный код имеет используемое пространство имен, но да, если OP не исправит свой пост, нет смысла делать предположения. - person 463035818_is_not_a_number; 27.06.2017
comment
@tobi303 Как насчет using std::cin;? - person juanchopanza; 27.06.2017
comment
@juanchopanza, тогда он не скомпилировался бы, если бы у него также не было using std::cout, но на самом деле вам не нужно меня убеждать. ОП пропускает mcve и не может ответить должным образом как есть. И на самом деле, даже если бы у него было using namespace std;, плохая вещь в том, что это плохой выбор имен переменных, а проблема с использованием просто второстепенна, имхо. - person 463035818_is_not_a_number; 27.06.2017
comment
@ tobi303 Локальная область действия 1-я, как всегда. - person πάντα ῥεῖ; 27.06.2017
comment
@πάνταῥεῖ вам, вероятно, следует упомянуть, что локальный cin затеняет глобальный cin - person Mgetz; 27.06.2017
comment
@Mgetz Сделано так. - person πάντα ῥεῖ; 27.06.2017
comment
@ChristopherPisz Я не хочу присоединяться к бессмысленной драке, но я видел исходный ответ до каких-либо правок, и в нем было примечание о том, что предполагается, что есть using namespace std;. Я согласен с тем, что вопрос следует сначала улучшить, прежде чем на него можно будет правильно ответить, но я думаю, что вы немного слишком остро реагируете - person 463035818_is_not_a_number; 27.06.2017

Хорошо, это ваша возможность присоединиться к белой стороне силы и прекратить использовать using namespace std;

Следующий пример отлично работает для входов int:

#include <iostream>

int main ()
{
       int cin;
       std::cin >> cin;
       std::cout << "cin: " << cin;
       return 0;
}

Почему? В вашем примере ваше локальное имя int cin будет иметь преимущество перед cin из std и заставит вашу программу использовать UB с использованием переменной int без инициализации.

И хороший совет, но офтоп может заключаться в том, чтобы проверить результат std::cin::operator >> с помощью failbit, подобного этому ссылка

person Rama    schedule 27.06.2017
comment
Спасибо Рама. Я все равно не знаю, почему люди голосуют против, спасибо за ваше драгоценное время. - person Shivam Arora; 27.06.2017
comment
это исправление, но на самом деле не объясняет, почему код OPs производит вывод, который он делает - person 463035818_is_not_a_number; 27.06.2017
comment
@ShivamArora Ваш вопрос занижен, потому что это не очень хороший вопрос. Да, это вопрос, но это такой простой вопрос, что вы можете взять базовую книгу по C++, прочитать первую главу и выяснить, в чем ваша проблема. Вы показали, что не проводили никаких исследований и не понимали, что написали. - person Javia1492; 27.06.2017
comment
@ tobi303 Спасибо!, добавлено объяснение - person Rama; 27.06.2017
comment
@ChristopherPisz Спасибо, добавлен совет по проверке фейлбита. - person Rama; 27.06.2017