@avion123678

Запись в переменную литерала не его типа?

Здравствуйте, почему если попытаться записать в переименую типа int символ, то не выдается ошибки, а переменной присваивается 0?

#include <iostream>

int main()
{
  int a;
  
  std::cin >> a;
  
  std::cout << "a  = " << a;
}


Вводим символ f.

Результат:
a = 0
  • Вопрос задан
  • 131 просмотр
Решения вопроса 1
myjcom
@myjcom Куратор тега C++
#include<iostream>
int main()
{
  int a;
  std::cin.operator>>(a);
  std::operator<<(std::cout, "a  = ").operator<<(a);
}

это std::cin
а это то, что вызывается для чтения int.
2. basic_istream& operator>>( int& value );

подробнее...

где-то тут он проверяет что вы ввели, потом генерируется исключение и состояние потока переходит в
this->_M_setstate(ios_base::badbit)

Данил,
Каким образом символы конвертируется именно в 0?

где-то там же вашей переменной int a; присваивается ноль __v = 0;
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@vanyamba-electronics
Потому что это ваша ответственность, чтобы ввод из потока был синтаксически правильным.
В приведённом алгоритме любое введённое значение является синтаксически приемлемым. Например, 0.
Если вам требуется различать то, что вводит пользователь, правильно это или неправильно, вам нужно написать алгоритм, который будет это делать.
Ответ написан
jcmvbkbc
@jcmvbkbc
http://dilbert.com/strip/1998-08-24
Запись в переменную литерала

Выглядит так: int a = 1; 1 -- это литерал. Ввод из потока к литералам отношения не имеет.

почему если попытаться записать в переименую типа int символ, то не выдается ошибки

Выдаётся, только ты её не проверяешь. Меняется failbit потока. Попробуй:

#include <iostream>

int main()
{
  int a;
  
  std::cin >> a;
  std::cout << "a  = " << a << ", cin.fail() = " << std::cin.fail() << std::endl;
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
19 сент. 2019, в 13:18
5000 руб./за проект
19 сент. 2019, в 13:16
20000 руб./за проект