IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    C语言解惑之逻辑操作符和增量操作符

    TacuLee发表于 2015-09-26 08:52:52
    love 0

    #define PRINT(int) printf("%d/n", int)
    
    main()
    {
      int x, y, z;
    
      x = 2; y = 1; z = 0;
      x = x && y || z; PRINT(x);
      PRINT(x || !y && z);
    
      x = y = 1;
      z = x++ - 1; PRINT(x); PRINT(z);
      z += - x ++ + ++y; PRINT(x); PRINT(z);
      z = x / ++ x; PRINT(z);
    }

    对于

    x = x && y || z;

    x || !y && z;

    z = x++ - 1;

    z += - x ++ + ++y;

    以上这些只要考虑到操作符的优化级和关联规则,还有以前提到过的贪心法(大嘴法)就可以得出结果了。同贪心法的知识,请参考:C语言陷阱与缺陷之词法分析中的“贪心法”。

    我们重点研究一下z = x / ++x这个语句。

    (z = (x / (++ x)))

    如果你还像以前那样按照从内到外的顺序对这个表达式进行求值,即先对x进行递增,然后作为除数、用x作被除数去进行除法计算。问题是:作为被除数的x到底是几?是3还是4?换个问法,被除数到底是递增前的x值,还是递增后的x值?请注意,C语言并没有对这种“副作用”作出明确的规定,而是由C编译器的编写者决定的。这个例子的教训是:如果你无法断定会不会产生副作用,那么就尽量不要写这样的表达式。

    未经允许不得转载:TacuLee » C语言解惑之逻辑操作符和增量操作符



沪ICP备19023445号-2号
友情链接