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);
摘自我看过的书:
关联性可以有两种类型:
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);