Chinaunix首页 | 论坛 | 博客
  • 博客访问: 424978
  • 博文数量: 103
  • 博客积分: 1455
  • 博客等级: 上尉
  • 技术积分: 1380
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-15 22:17
文章分类

全部博文(103)

文章存档

2013年(4)

2012年(99)

我的朋友

分类: C/C++

2012-09-29 21:51:32

按照理书本上讲的,c语言并不关注你在什么地方放置空格,通常编译器应该忽略空格的存在,比如说我就喜欢在赋值语句的=两端加上空格,这样看起来很好看。
今天看c和指针的第五章讲操作符的优先级和求值顺序,于是在gcc上尝试了84页的表达式,具体代码如下

点击(此处)折叠或打开

  1. int main()
  2. {
  3.     int i = 10;
  4.     i= i-- - --i * ( i = -3 ) * i++ + ++i;
  5.     printf("%d\n",i);
  6.     return 0;
  7. }

注意这个空格的方式,这样编译出来的结果是22,我的gcc版本为3.2.2 20030222
如果去掉空格

点击(此处)折叠或打开

  1. int main()

  2. {

  3.     int i = 10;

  4.     i= i-----i * ( i = -3 ) * i+++++i;

  5.     printf("%d\n",i);

  6.     return 0;

  7. }

编译就会出错invalid lvalue in decrement/increment
 
如果修改空格的位置如下

点击(此处)折叠或打开

  1. int main()

  2. {

  3.     int i = 10;

  4.     i= i- - - - -i * ( i = -3 ) * i+ + + + +i;

  5.     printf("%d\n",i);

  6.     return 0;

  7. }
结果就变为21,这是一件有趣的事情,不知道空格对于编译时操作符的结合会有什么影响,书上说改变gcc的优化可以改变其结果,可是我加如-O也没有改变,不知道是我理解错误还是和gcc的版本有关?
总之不要随便使用+++++这样的操作符,我想也不会有程序猿这么用,不过还是希望有大拿能解释为什么这样。。。
 
我又尝试了加入括号()的代码

点击(此处)折叠或打开

  1. int main()

  2. {
  3.     int i = 10;
  4.     i= (i--)-(--i) * ( i = -3 ) * (i++)+(++i);
  5.     printf("%d\n",i);
  6.     return 0;

  7. }

结果同样为22
 
阅读(2071) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

momser2012-10-10 20:30:18

今天看c陷阱缺陷的"词法分析的贪心法"原来++这种操作符是不能用space分割的我去,好吧,那分割了之后就变成负号了,那就可以解释了,但是当不分割的时候是解释为什么呢?应当是从左向右结核性的话就是(--)(--)-这样子,可是为什么会和后面(--)-(--)的结果一样呢