现在的位置: 首页 > 综合 > 正文

cout的输出顺序

2018年12月13日 ⁄ 综合 ⁄ 共 1271字 ⁄ 字号 评论关闭

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<<j<<" "<<j++<<endl;//0 0

   //printf("%d %d\n",j++,j);//0 0
   //cout<<i++<<" "<<i<<endl;//0 1

    //printf("%d %d\n",i,++i);//1 1
    //cout<<j<<" "<<++j<<endl;//1 1


   //printf("%d %d\n",++j,j);//1 1
   //cout<<++i<<" "<<i<<endl;//1 1

    
    /*printf("%d,%d,%d\n",f1(),f2(),f3());
    cout<<f1()<<f2()<<f3()<<endl;*/
    //printf("%d \n", i++);//0

    printf("%d %d\n",++i, i++);//1 0
    cout<<++j<<" "<<j++<<endl;//1 0
   
    return 0; 
} 

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

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



【上篇】
【下篇】

抱歉!评论已关闭.