概述
int c = 5;
cout<<(c = 2)<<" "<<(c = 3)<<" "<<(c = 1)<<endl;
cout是从右到左依次求解,再输出的
2 2 2
int a = 1;
cout<<a++<<" "<<a<<endl;
int b = 1;
cout<<++b<<" "<<b<<endl;
output:
1 2
2 2
如果是
cout << sizeof(a++) << a << endl
output:
4 1
sizeof更像一个特殊的宏,它是在编译阶段求值的。举个例子:
cout<<sizeof(int)<<endl; // 32位机上int长度为4 cout<<sizeof(1==2)<<endl; // == 操作符返回bool类型,相当于 cout<<sizeof(bool)<<endl; |
在编译阶段已经被翻译为:
cout<<4<<endl; cout<<1<<endl; |
这里有个陷阱,看下面的程序:
int a = 0; cout<<sizeof(a=3)<<endl; cout<<a<<endl; |
输出为什么是4,0而不是期望中的4,3???就在于sizeof在编译阶段处理的特性。由于sizeof不能被编译成机器码,所以sizeof作用范 围内,也就是()里面的内容也不能被编译,而是被替换成类型(也就是说括号内的表达式不会运算)。=操作符返回左操作数的类型,所以a=3相当于int,而代码也被替换为:
int a = 0; cout<<4<<endl; cout<<a<<endl; |
所以,sizeof是不可能支持链式表达式的,这也是和一元操作符不一样的地方。
结论:不要把sizeof当成函数,也不要看作一元操作符,把他当成一个特殊的编译预处理。
int f1()
{
printf("f1()n");
return 1;
}
int f2()
{
printf("f2()n");
return 2;
}
int f3()
{
printf("f3()n");
return 3;
}
int main(void)
{
int i = 0;
int j = 0;
//printf("%d %dn",i,i++);//0 0
//cout<<j<<" "<<j++<<endl;//0 0
//printf("%d %dn",j++,j);//0 0
//cout<<i++<<" "<<i<<endl;//0 1
//printf("%d %dn",i,++i);//1 1
//cout<<j<<" "<<++j<<endl;//1 1
//printf("%d %dn",++j,j);//1 1
//cout<<++i<<" "<<i<<endl;//1 1
/*printf("%d,%d,%dn",f1(),f2(),f3());
cout<<f1()<<f2()<<f3()<<endl;*/
//printf("%d n", i++);//0
printf("%d %dn",++i, i++);//1 0
cout<<++j<<" "<<j++<<endl;//1 0
return 0;
}
一般来讲是,从右向左,依次压入栈中,然后再依次弹出
但是对于i,++i,之类的,的确没有什么规律。。。
最后
以上就是认真楼房为你收集整理的cout的输出顺序的全部内容,希望文章能够帮你解决cout的输出顺序所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复