Chinaunix首页 | 论坛 | 博客
  • 博客访问: 291681
  • 博文数量: 63
  • 博客积分: 814
  • 博客等级: 军士长
  • 技术积分: 700
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-09 15:46
文章分类

全部博文(63)

文章存档

2017年(1)

2016年(4)

2015年(13)

2014年(9)

2012年(3)

2011年(33)

分类: C/C++

2011-08-15 09:37:24

    1. #include<stdio.h>;
    2. void main()
    3. {
    4.     char *ptr = "csdn";
    5.     printf( "%c\n",*(ptr++) );
    6. }

    7. 结果是什么,不许用编译器,看题后5秒钟内开始回答,还要说出原因
    1. #include<stdio.h>;
    2. void main()
    3. {
    4.     int i = 10;
    5.     i << 1;
    6.     i >;>; 5;
    7.     printf( "%d\n", i);
    8. }
    第一个是c,ptr++是在语句执行完后才执行++操作的,有没有括号都一样。
    第二个是10,单独的没有赋值的移位操作是不会改变原数大小的。
        如果改成i=i<<1;i=i>;>;5;的话,结果就是0了。



  1. *(ptr++) != *(ptr+1)
  2. 后面的那个表达式确实由于括号的原因改变了优先级,从而应该输出s,
  3. 但后缀加运算的规则是不同的,有一个简单的例子,
  4. for(i=0;i<n;i++)
  5. {
  6.      printf("%d\n",i);
  7. }
  8. 输出一定是0-9吧,换一种写法,
  9. for(i=0;i<n;(i++))
  10. {
  11.      printf("%d\n",i);
  12. }
  13. 这是会是什么情况呢?还是0-9,不可能变成1-10的。

  14. 其实原因就是,后缀加语句在一个复合语句中的时候,
  15. 一定是先使用变量的值,然后再进行加1操作的。
  16. 以上是我自己对C的理解,暂时无法提供更好的参考资料,
  17. 要是有不当的地方还请见谅。

------------------------------------------------------
因为*.++处于同一优先级14级,改级的结合方向是  右-->;左,++比*先来做,所以括号不要了.

-------------------------------------------------------
从编译原理上说,n++运算的语法定义恐怕是(yacc语法示意):
  1. {val}'+''+' :{$$=$1;$1=$1+1}
  2.             ;

加不加()不影响表达式的值。
阅读(4113) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~