为什么不会自动分配 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
在编译时解析。编译器推断 number
是 int
类型,因为 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
的原因:它将 永远不会 任何更高的值。曾经。
使用 auto,我创建了一个变量 number 并使用 cin.get 来获取值。我使用这段代码来做到这一点:
auto number = cin.get();
cout << typeid(number).name() << endl;
似乎即使我输入了一个超过 2147483647 的数字,该值仍然被分配为 int 类型。为什么是这样?如果数字超过最大 32 位 int 值,难道不应该自动分配一个 long 类型的值吗?
auto
在编译时解析。编译器推断 number
是 int
类型,因为 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
的原因:它将 永远不会 任何更高的值。曾经。