- 思考
- 逗号表达式
- 贪心法++,--表达式的阅读技巧
- 例题
先举个栗子:
int i = 3; i = (++i) + (++i) + (++i); //编译器会有两个结果18和16 //三个一起算和先算先两个
再举一个:
int i = 1;
printf("%d,%d,%d",++i,i,i++);
//这个凭直觉判断也会直接错误
//涉及的知识我还不太会
解释都是编译器未定义的行为,由编译器决定
逗号表达式面对这个问题,引入逗号表达式
- 逗号表达式是C语言优先级最低的运算符。
- 逗号表达式是左结合性(即按从左到右顺序运算)的运算符。
来个栗子:
int x; int i = 3; x = (++i,i++,i+10); //结果是15
这里要注意i++是先赋值这条语句运算完后才会+1
但在逗号表达式里,除非在最后一个,i++会在进入下一个逗号前就+1
int x; int i = 3; x = (++i,i+10,i++); //结果是4
i + 10并不是一个赋值语句,此时表达式的值还是4(反直觉的)
i++在逗号表达式的末尾,等这条语句运算完后才会+1。
贪心法++,–表达式的阅读技巧
编译器处理的每个符号应该尽可能多的包含字符
编译器以从左向右的顺序一个一个尽可能多的读入字符
当即将读入的字符不可能和已读入的字符组成合法符号为止
栗子来喽:
int c,a = 1,b = 2;
c = a+++b; //a++ + b
printf("c=%dn",c); //3
printf("a=%dn",a); //2
贪心读到空格会停止
int* p = &a; b = b/*p return 0;
这时/后面全都备注了,连return 0;也是。
加上空格会停止读取
int* p = &a; b = b / *p return 0;
例题
加深一下理解
int x=5,y=8,z;
z=(x++,++y,x+++y);
求z=_______
首先依次执行x++得到x=6、++y得到y=9
x+++y,x++的优先级大于++y
所以这里是(x++)+y
x++是先进行赋值操作再自加1,故先把x与y的值相加,再把x自加1;
也就是z = x + y; x += 1;
这里z的值还是15,但x加了1 是7;



