为什么不会自动分配 long long 类型的值?

Why won't auto assign values of type long long?

使用 auto,我创建了一个变量 number 并使用 cin.get 来获取值。我使用这段代码来做到这一点:

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

似乎即使我输入了一个超过 2147483647 的数字,该值仍然被分配为 int 类型。为什么是这样?如果数字超过最大 32 位 int 值,难道不应该自动分配一个 long 类型的值吗?

auto 在编译时解析。编译器推断 numberint 类型,因为 std::istream::get returns 一个 int.

如果这是一个问题,请在此处明确使用 long long

auto 在编译时解析,并根据 cin.get() 的 return 类型决定(恰好是 int by定义).

此外,表达式 typeid(number).name() 也在编译时求值,这意味着编译器将其解析为常量值(例如,"i" 对于我的系统)并将其存储在可执行文件。

所以 auto 没有任何改变。 istream::get()istream::getline() 都不会真正解析输入以查看它是否为数字。

但让我们看看一些选项:

cin.get()

此 returns 一个表示输入流的一个字符的 int。但是它代表的是一个字符,不是一个数字。

cin.getline()

这是一个错误。
没有不需要参数的 istream::getline() 重载。

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

这将存储一行输入(如果太长则存储 100 个字符)并将其存储在字符串 s.

除了已经说过的 auto

这里"enter a number that is over 2147483647"是不可能的。 cin.get() 未格式化的输入 。您正在读取 字节 ,而字节(假设 CHAR_BIT==8)最多只能达到 255。这就是 cin.get() returns 和 int 的原因:它将 永远不会 任何更高的值。曾经。