我是靠谱客的博主 认真楼房,最近开发中收集的这篇文章主要介绍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 %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的输出顺序所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(56)

评论列表共有 0 条评论

立即
投稿
返回
顶部