代码之家  ›  专栏  ›  技术社区  ›  Nick Bolton

运算符优先级分组如何在C中用于*、/和%?

  •  1
  • Nick Bolton  · 技术社区  · 15 年前

    提到C的O'Reilly Pocket引用,我对 * , / % 操作员。书上说 分组 从左到右发生--现在我想我将分组与评估顺序混淆了。考虑到下面的等式,以及根据这本书建立的规则,我会认为…

    int x = 4 / 3 * -3
    

    …计算结果为 0 ,因为…

    1: 4 / 3 * -3
    2: 4 / -9
    3: 0
    

    …然而,它实际上评估为 -3 似乎用这种方法…

    1: 4 / 3 * -3
    2: 1 * -3
    3: -3
    

    为什么?

    8 回复  |  直到 13 年前
        1
  •  7
  •   Matthew Flaschen    15 年前

    这对我来说很有意义:

    int x = 4 / 3 * -3;
    

    从左到右分组,我们得到:

    int x = (4 / 3) * -3
    int x = ((4 / 3) * -3);
    

    另请参见 precedence table . 它们具有相同的优先级,因此它们从左到右绑定。

        2
  •  5
  •   Thomas Padron-McCarthy    15 年前

    你需要知道 优先 以及 结合性 操作人员。

    乘法(*)比加法(+)具有更高的优先级,这就是为什么在C和普通数学中,2+3*4被解释为2+(3*4)。但是在2*3/4或2*3*4这样的表达式中,操作符的优先级都相同,您需要查看关联性。对于大多数运算符,它是从左到右的,这意味着从左开始分组:2*3/4变为(2*3)/4,2*3*4*5变为((2*3)*4)*5,依此类推。

    一个例外是赋值,它是C中的一个运算符。赋值是右相关的,所以a=b=3应该读作a=(b=3)。

    任何好的C书或教程都应该有一个包含所有运算符的表(例如 this one ,具有优先级和关联性。

        3
  •  2
  •   muruga    15 年前

    访问以下URL。它对C语言中的所有主题都非常有用,因此您也可以使用运算符优先级。

     http://www.goldfish.org/books/The%20C%20Programming%20Language%20-%20K&R/chapter2.html#s2.12
    
        4
  •  1
  •   Pavunkumar    15 年前

    在这里,它与系统识别保持关联。所以,它会执行第二个 仅用于计算表达式的示例。

        5
  •  1
  •   Arun    15 年前

    imho,很好地了解这些运算符的先例,但是最好在有疑问时使用括号:—)。正如大师们所说,代码更适合人类读者,而不是机器读者;如果作者不确定,读者也不会。

        6
  •  0
  •   dsolimano    15 年前

    乘法和除法是左相关的,所以第二个顺序是发生的-操作被分组为(4/3),然后结果乘以-3。

        7
  •  0
  •   Wladimir Palant    13 年前

    These links 应该会帮你的。

        8
  •  0
  •   Wladimir Palant    13 年前

    对于数学来说,C的工作方式和你在高中时学的一样。记住Bodmas(除法、乘法、加法和减法的括号)。这意味着它从左到右查找一个计算。在这种情况下,它看到 4/3 并计算出答案,然后将答案乘以-3。你可以用括号来解决这个问题( 4/(3*-3) )看看 this page 有关C如何排序运算符和执行计算的摘要。