重载插入器和奇怪的输出('20'和'020')

时间:2011-08-11 13:48:55

标签: c++ operator-overloading

我正在学习超载'<<<在一个非常简单的程序中,&在我的学习期间,我发现了以下令人惊讶的计划输出。

#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;
 }

任何解释请

6 个答案:

答案 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,因为它做十六进制。 :)