C 中运算符的结合性

Associativity of operators in C

摘自我看过的书:

关联性可以有两种类型:
1-从左到右
从左到右的结合性意味着左操作数在什么意义上必须是 unambiguous.Unambiguous ?它不能参与任何其他子表达式的评估。
2-从右到左
同上

现在请阅读以下代码:

#include <stdio.h>

/* no of item purchased>1000 then discount of 10% else full price */
int main()
{
  int n;
  float r,p,d,t;

  printf("Enter the no of item purchased");
  scanf("%d", &n);

  printf("Enter the price per item");
  scanf("%f", &r);

  if(n > 1000)
  {
    p = n * r;
    printf("Price before discount = %f\n", p);

    d = 10 / 100 * p; //please have a carefull look at d
    printf("discount offered is = %f\n", d);

    t = p - d;
    printf("total price after discount = %f\n", t);
  }
  else
  {
    p = n * r;
    printf("total price is = %f", p);
  }

  return 0;
}

如上述代码"d=10/100*p"所示,它遵循 L-->R 关联性,因为 p 是先前计算的,涉及其他表达式的计算。
现在更改 d "d=p*10/100" 这种情况可以正确计算折扣,但高于 1 会给出零作为答案。

任何人都可以在上面的例子的上下文中解释关联性。

乘法 */ 都是从左到右的运算符。它们甚至具有相同的优先级。

因此,您的表达式可以像这样重写而不改变其含义:

d = (10 / 100) * p
d = (p * 10) / 100

因为 10 / 100 是一个整数除法,结果是 0,希望现在您可以看出区别。

C 的算术 *(以及 -+)运算符是结合的,就像它们是数学一样:

这些行的计算结果为 true:

A * B * C == (A * B) * C == A * (B * C);

(或 A、B、C 的任意排列,因为 * 也是可交换的——即 x*y == y*x 为真)

然而,这通常是不正确的:

A / B / C == (A / B) / C == A / (B / C);