cout的输出顺序

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,之类的,的确没有什么规律。。。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值