按照理书本上讲的,c语言并不关注你在什么地方放置空格,通常编译器应该忽略空格的存在,比如说我就喜欢在赋值语句的=两端加上空格,这样看起来很好看。
今天看c和指针的第五章讲操作符的优先级和求值顺序,于是在gcc上尝试了84页的表达式,具体代码如下
- int main()
- {
- int i = 10;
- i= i-- - --i * ( i = -3 ) * i++ + ++i;
- printf("%d\n",i);
- return 0;
- }
注意这个空格的方式,这样编译出来的结果是22,我的gcc版本为3.2.2 20030222
如果去掉空格
- int main()
- {
- int i = 10;
- i= i-----i * ( i = -3 ) * i+++++i;
- printf("%d\n",i);
- return 0;
- }
编译就会出错invalid lvalue in decrement/increment
如果修改空格的位置如下
- int main()
- {
- int i = 10;
- i= i- - - - -i * ( i = -3 ) * i+ + + + +i;
- printf("%d\n",i);
- return 0;
- }
结果就变为21,这是一件有趣的事情,不知道空格对于编译时操作符的结合会有什么影响,书上说改变gcc的优化可以改变其结果,可是我加如-O也没有改变,不知道是我理解错误还是和gcc的版本有关?
总之不要随便使用+++++这样的操作符,我想也不会有程序猿这么用,不过还是希望有大拿能解释为什么这样。。。
我又尝试了加入括号()的代码
- int main()
- {
- int i = 10;
- i= (i--)-(--i) * ( i = -3 ) * (i++)+(++i);
- printf("%d\n",i);
- return 0;
- }
结果同样为22
阅读(2100) | 评论(1) | 转发(0) |