C语言中表达式 a+++++b 的含义

来源:互联网 发布:电脑安装软件被禁止 编辑:程序博客网 时间:2024/06/06 00:22

看到这个怪异的表达式,你的第一感觉是什么结果呢?你或许会这样组合:(a++)+(++b),或者这样组合:((a++)++)+b。哪一个表达式正确呢?C语言的操作符优先级是“++”高于“+”,所以第二个组合是正确的。那结果是什么呢?还是先编译下看看吧:

#include<stdio.h>#include<stdlib.h>int main(){int a,b,c;a=b=1;printf("a+++++b=%d\n",a+++++b);return 0;}
$ gcc -o t test.ctest.c: In function 'main':test.c:7:26: error: lvalue required as increment operand
提示“左值需要操作数”。左值?左值就是可以在"="左边,能被赋予值的东西;右值则是在"="右边,可以赋值给别人的东西。所以左值必须是有内存空间的东西;而右值则既可以是变量,也可是常量和某种表达式,只要能提供一个值即可。这里的左值只有第二个“++”的左值了。说明“a++”不是一个操作数。

“a++”不能作为左值的原因是什么呢?表达式“a++”是先返回a的值(value,本例中也就是1),再对a的引用加1 。所以本例中“(a++)++”实际上等价于“1++”,这个肯定是不合法的啊。怎么让这个表达式修改为合法呢?这样试下:a+++(++b)。结果为3 。(++a能否作为左值有待研究,gcc编译器是不可以,但见有网友说可以,查清楚后再发布。)

自增操作符的易错点:

#include<stdio.h>#include<stdlib.h>int main(){int a,b,c,d;a=b=c=d=1;printf("a++ + a++=%d and a=%d\n",a++ + a++,a);printf("++b + ++b=%d and b=%d\n",++b + ++b,b);printf("c++ + c++ + c++=%d and c=%d\n",c++ + c++ + c++,c);printf("++d + ++d + ++d=%d and d=%d\n",++d + ++d + ++d,d);return 0;}

结果:

$ gcc -o t2 test2.c$ t2a++ + a++=2 and a=3++b + ++b=6 and b=3c++ + c++ + c++=3 and c=4++d + ++d + ++d=10 and d=4

理解:后置自增操作符是先进行赋值操作再进行两次自增,而前置自增操作符刚好是相反(这样理解似乎也不是太恰当,看最后一个例子)。最后一个例子怎么理解?表达式除了考虑++优先级问题外还要考虑“+”运算符的左结合性,表达式先进行(++d + ++d),然后再和后面的++d求和,即3+3+4 。