我正在学习超载'<<<在一个非常简单的程序中,&在我的学习期间,我发现了以下令人惊讶的计划输出。
#include<iostream>
#include<conio.h>
#include<string>
using namespace std;
class student
{
int age;
public:
student(){}
student(int a){age=a;}
friend ostream &operator<<(ostream &stream,student o);
};
/*operator overloaded in this block*/
ostream &operator<<(ostream &stream,student o)
{
stream<<o.age;
return stream;
}
int main()
{
student ob1(20),ob2(020);
cout<<ob1; /*will yield 20(as desired)*/
cout<<"\n"<<ob2; /*yielding 16(why so)*/
_getch();
return 0;
}
任何解释请
答案 0 :(得分:11)
0是C ++整数文字的八进制前缀,八进制中的20是十进制的16。
进一步解释:如果文字以0开头,则该数字的其余部分将被解释为八进制表示。在你的例子中2 * 8 ^ 1 + 0 * 8 ^ 0。
整数文字的语法在最新的标准草案中的§2.14.2中给出。
答案 1 :(得分:5)
student ob1(20),ob2(020);
您已写入020,由于开头为零,因此在C和C ++中将其解释为八进制编号(基数为8)。所以020的十进制值为16。
答案 2 :(得分:3)
你会在这里找到答案:
How does C Handle Integer Literals with Leading Zeros, and What About atoi?
您为文字加前缀为零,这意味着将数字视为八进制,20oct为16dec。
答案 3 :(得分:2)
020
在八进制中为20,正如0x20
在十六进制中为20。删除前面的0,它应该工作。
答案 4 :(得分:1)
前导0指定它是八进制数(基数为8),因此八进制中的20是16。
答案 5 :(得分:1)
它将020作为八进制交互。 2 * 8 = 16。尝试将其切换为3,itll显示24为030.如果你把0x20 itll转到32,因为它做十六进制。 :)