使用前导零初始化整数会产生意外结果 (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。