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. :)
精彩评论