@avion123678

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

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

#include <iostream>

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


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

Результат:
a = 0
  • Вопрос задан
  • 134 просмотра
Решения вопроса 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
"I'm here to consult you" © Dogbert
Запись в переменную литерала

Выглядит так: 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;
}
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы