C/C++ 求值顺序example 2

#include<stdio.h>

// 函数的入参是表达式的时候,先完成对各表达式求值(求值顺序不定)
// 然后, 再将求值完成后得到的变量(或表达式返回的临时对象)的结果初始化行参。
// (注意,在执行被调函数前的最后时刻,副作用生效)
// 注意:表达式 ++i 和 --i 作为函数入参, 其本质是将i自身作为入参,因为2者返回的是对象(运算过的)自己
//      所以, 函数在初始化形参时,使用的自然是i(毕竟,返回值是自己嘛)
//      i--和i++则返回的是i的副本(并非i)
// 但,对于操作符, 取的是表达式的当前返回的结果
// 例如: *++p; 假定(其实必定,就算先运算*(++p) 子表达式)先运算子表达式++p,
//       其运算结果在下一个顺序点到来之前,可能未从寄存器cpoy到内存。
//       而*操作符需要的只是对++p当前返回的(寄存器运算)结果进行处理
int main()
{
    int i=1;
    int j=2;
    int a = 100;
    int b = 200;
    int c = 300;
    int d = 400;
    int e = 500;

    printf("%d%d%d\n",(--i),(++i),i);
    printf("%.3f a=%d b=%d\n",1.0,a,b);
/*
111
1.000 a=100 b=200
*/


    // printf("%d%d%d\n",(b = --i),(a = ++i),i);
    // printf("%.3f a=%d b=%d\n",1.0,a,b);
/*result:
121
1.000 a=2 b=1
*/

    i = 1; 
    printf("%d%d%d%d%d%d%d\n",i,(e = i++),(d = i--),(c = --i),(b = ++i),(a = ++i),i);
    printf("a=%d b=%d c=%d d=%d e=%d\n",a,b,c,d,e);
/*
2122322
a=2 b=3 c=2 d=2 e=1
*/


    // printf("j=%d%d\n", ++j, (++j));
    // printf("j=%d\n", j);
/*
j=44
j=4
*/

     printf("j: %d %d\n", --j, ++j);
     printf("j=%d\n", j);
/*
j: 2 2
j=2
*/
// 并非编译器优化的结果,而是先完成对各表达式求值(求值顺序不定)
// (注意,在执行被调函数前的最后时刻,副作用生效),最后j=2,
// 所以输出2 2



    // printf("j: %d %d\n", j--, j++);
    // printf("j=%d\n", j);
/*
j: 3 2
j=2
*/

    // printf("j: %d %d\n", j--/*copy此时j的值给副本,j-1,返回副本,即实际打印了副本内容*/, ++j/*打印各入参表达式求值完成后,j最终的值*/);
    // printf("j=%d\n", j);
/*
j: 3 2
j=2
*/

    return 0;
}

C/C++ 求值顺序example 2,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。