使用前导零初始化整数会产生意外结果 (C++)
Initializing integer with leading zeroes gives unexpected result (C++)
问题总结
假设出于某种原因试图将整数 31 存储为 int num = 0031;
如果我打印出 num
,我会得到 25。但是,如果我使用 cin
,存储的数字确实是 31。
您可以通过 运行 以下代码验证这一点,并在出现提示时键入 0031。
代码
#include <iostream>
using namespace std;
int main() {
cout << "Version 1\n========="<< endl;
{
int num = 0031;
cout << "Input was: " << num << endl;
}cout << "=========" << endl;
cout << "Version 2\n========="<< endl;
{
int num;
cout << "Insert num: ";
cin >> num;
cout << "Input was: " << num << endl;
}cout << "=========" << endl;
return 0;
}
搜索答案,我找到了这个 Int with leading zeroes - unexpected result
C++也是这样吗?即,带前导零的整数存储为八进制整数?
为什么第二个块给出了预期的结果?是不是因为使用 cin
时,流存储为字符串,然后隐式使用 stoi()
函数?
对于 C++ 中的整数文字,请参见此处的示例:https://en.cppreference.com/w/cpp/language/integer_literal。是的,0031
是一个八进制整数文字。
要从第二个版本的代码中获得预期的输出,您可以使用 std::oct
io-manipulator:
int num;
cout << "Insert num: ";
cin >> std::oct >> num;
cout << "Input was: " << num << endl;
这是因为您正在用 八进制整数文字初始化num
。其值为十进制的 25。
问题总结
假设出于某种原因试图将整数 31 存储为 int num = 0031;
如果我打印出 num
,我会得到 25。但是,如果我使用 cin
,存储的数字确实是 31。
您可以通过 运行 以下代码验证这一点,并在出现提示时键入 0031。
代码
#include <iostream>
using namespace std;
int main() {
cout << "Version 1\n========="<< endl;
{
int num = 0031;
cout << "Input was: " << num << endl;
}cout << "=========" << endl;
cout << "Version 2\n========="<< endl;
{
int num;
cout << "Insert num: ";
cin >> num;
cout << "Input was: " << num << endl;
}cout << "=========" << endl;
return 0;
}
搜索答案,我找到了这个 Int with leading zeroes - unexpected result
C++也是这样吗?即,带前导零的整数存储为八进制整数?
为什么第二个块给出了预期的结果?是不是因为使用 cin
时,流存储为字符串,然后隐式使用 stoi()
函数?
对于 C++ 中的整数文字,请参见此处的示例:https://en.cppreference.com/w/cpp/language/integer_literal。是的,0031
是一个八进制整数文字。
要从第二个版本的代码中获得预期的输出,您可以使用 std::oct
io-manipulator:
int num;
cout << "Insert num: ";
cin >> std::oct >> num;
cout << "Input was: " << num << endl;
这是因为您正在用 八进制整数文字初始化num
。其值为十进制的 25。