博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cout的输出顺序
阅读量:4155 次
发布时间:2019-05-25

本文共 1061 字,大约阅读时间需要 3 分钟。

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 %d\n",i,i++);//0 0   //cout<
<<" "<
<

一般来讲是,从右向左,依次压入栈中,然后再依次弹出

但是对于i,++i,之类的,的确没有什么规律。。。

转载地址:http://yveti.baihongyu.com/

你可能感兴趣的文章
Android中线程同步之Mutex与Condtion的用法
查看>>
EGLImage与纹理
查看>>
Android createWindowSurface failed EGL_BAD_ALLOC 引起Crash的解决方案
查看>>
VAO与VBO
查看>>
对进程地址空间的一点认识
查看>>
Android下打印调试堆栈方法总结以及strace工具使用
查看>>
分析linux下的进程地址空间,以及c语言的函数调用过程
查看>>
Android用surface直接显示yuv数据(二)
查看>>
Android中native_handle private_handle_t ANativeWindowBuffer ANativeWindow GraphicBuffer Surface的关系
查看>>
Android 4.4(KitKat)中的设计模式-Graphics子系统
查看>>
lighthouse3d的GLSL教程
查看>>
surfaceflinger composer flow && mutex introduction
查看>>
关于Android LCD和键盘背光亮度
查看>>
高通平台LCD的打开和关闭流程
查看>>
嵌入式 linux 去掉启动时闪烁的光标 和制作启动LOGO
查看>>
JAVA 学习之implements的用法
查看>>
手机锂离子电池基本概念
查看>>
班扎古鲁白玛的沉默
查看>>
脉宽调制的基本原理及其应用实例
查看>>
c语言数组排序小结(for beginner)
查看>>