Почему бы автоматически не присваивать значения типа long long?

Используя auto, я создал переменную number и использовал cin.get для получения значения. Я использовал этот код для этого:

auto number = cin.get();
cout << typeid(number).name() << endl;

Кажется, что даже если я введу число, которое превышает 2147483647, значение все равно получает присвоенный тип int. Почему это? Не следует ли автоматически присваивать значение типа long, если число превышает максимальное 32-битное значение int?

0

Решение

auto разрешается во время компиляции и определяется на основе типа возврата cin.get() (что бывает int по определению).

Кроме того, выражение typeid(number).name() также оценивается во время компиляции, что означает, что компилятор разрешает это постоянное значение (например, "i" для моей системы) и сохраняет его в исполняемом файле.

3

Другие решения

auto разрешается во время компиляции. Компилятор сделал вывод, что number имеет тип int так как std::istream::get возвращает int,

Если это проблема, используйте long long здесь явно

2

Так auto ничего не меняет И ни istream::get() ни istream::getline() на самом деле анализирует ввод, чтобы увидеть, если это число.

Но давайте посмотрим на некоторые варианты:

cin.get()

Это возвращает int, который представляет один символ входного потока. Но это символ, а не число.

cin.getline()

Это ошибка
Там нет перегрузки istream::getline() это не требует никаких аргументов.

char s[100]; cin.getline(s, 100);

Это сохранит строку ввода (или 100 символов, если она слишком длинна) и сохранит ее в строке s,

1

В дополнение к тому, что уже было сказано о auto

Здесь невозможно «ввести число, превышающее 2147483647». cin.get() является неформатированный ввод. Ты читаешь байтов, и байты (при условии CHAR_BIT==8) только идти до 255, Поэтому cin.get() возвращает int: будет никогда любое более высокое значение. Когда-либо.

0
По вопросам рекламы [email protected]