Используя auto, я создал переменную number и использовал cin.get для получения значения. Я использовал этот код для этого:
auto number = cin.get();
cout << typeid(number).name() << endl;
Кажется, что даже если я введу число, которое превышает 2147483647, значение все равно получает присвоенный тип int. Почему это? Не следует ли автоматически присваивать значение типа long, если число превышает максимальное 32-битное значение int?
auto
разрешается во время компиляции и определяется на основе типа возврата cin.get()
(что бывает int
по определению).
Кроме того, выражение typeid(number).name()
также оценивается во время компиляции, что означает, что компилятор разрешает это постоянное значение (например, "i"
для моей системы) и сохраняет его в исполняемом файле.
auto
разрешается во время компиляции. Компилятор сделал вывод, что number
имеет тип int
так как std::istream::get
возвращает int
,
Если это проблема, используйте long long
здесь явно
Так auto
ничего не меняет И ни istream::get()
ни istream::getline()
на самом деле анализирует ввод, чтобы увидеть, если это число.
Но давайте посмотрим на некоторые варианты:
cin.get()
Это возвращает int, который представляет один символ входного потока. Но это символ, а не число.
cin.getline()
Это ошибка
Там нет перегрузки istream::getline()
это не требует никаких аргументов.
char s[100]; cin.getline(s, 100);
Это сохранит строку ввода (или 100 символов, если она слишком длинна) и сохранит ее в строке s
,
В дополнение к тому, что уже было сказано о auto
…
Здесь невозможно «ввести число, превышающее 2147483647». cin.get()
является неформатированный ввод. Ты читаешь байтов, и байты (при условии CHAR_BIT==8
) только идти до 255
, Поэтому cin.get()
возвращает int
: будет никогда любое более высокое значение. Когда-либо.