开发者

overloading inserters and strange output(for '20' and '020') [duplicate]

开发者 https://www.devze.com 2023-03-27 03:29 出处:网络
This question already has answers here: What does it mean when a numeric constant in C/C++ is prefixed with a 0?
This question already has answers here: What does it mean when a numeric constant in C/C++ is prefixed with a 0? (7 answers) Closed 7 years ago.

i was learning to overload '<<' in a very simple program,& during my study,i found the following surprising output of my program.

#include<iostream>
#include<c开发者_如何学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;
 }

any explainations please


0 is the octal prefix for C++ integer literals and 20 in octal is 16 in decimal.

To explain further: If a literal starts with 0 the rest of the number will be interpreted to be in octal representation. In your example 2*8^1 + 0 * 8^0.

The syntax for integer literals is given in §2.14.2 in the most recent standard draft.


student ob1(20),ob2(020);

You have written 020 which in C and C++ is interpreted as an octal number (base 8) due to the zero at the start. So 020 has the value 16 in decimal.


You will find the answer here:

How does C Handle Integer Literals with Leading Zeros, and What About atoi?

You prefixed the literal with a zero, which means treat the number as octal and 20oct is 16dec.


020 is 20 in octal, just as 0x20 is 20 in hex. Remove the preceding 0 and it should work.


The leading 0 specifies that the it is an octal number (base 8) so 20 in octal is 16.


It's interpereting the 020 as an octal. 2*8=16. Try switching it to a 3, itll show 24 for 030. If you put 0x20 itll go to 32 as its doing hexadecimal. :)

0

精彩评论

暂无评论...
验证码 换一张
取 消