我正在阅读《K&R C 编程语言》,第 2.10 章中指出:
“如果 expr1 和 expr2 是表达式,那么
Run Code Online (Sandbox Code Playgroud)expr1 op= expr2相当于
Run Code Online (Sandbox Code Playgroud)expr1 = (expr1) op (expr2)除了 expr1 仅计算一次。”
op=指的是可以与赋值一起使用的二元运算符+=,-=例如 等(并且在第二行中 op 仅表示二元运算符,例如+)
我的第一个小困惑是它expr1必须只是一个变量(“左值”)?否则我们如何将结果分配给更大的表达式?expr1但我的主要问题是“仅计算一次”是什么意思?如果我们写:
expr1 = (expr1) op (expr2)
Run Code Online (Sandbox Code Playgroud)
代替
expr1 op= expr2
Run Code Online (Sandbox Code Playgroud)
这感觉很做作,但请考虑一下:
#include <stdio.h>
int x = 0;
int *f(void) { printf("f is called\n"); return &x; }
int
main(int argc, char **argv)
{
printf(" x = %d\n", x);
*f() += 1; /* Calls f once */
printf(" x = %d\n", x);
*f() = *f() + 1; /* Calls f twice */
printf(" x = %d\n", x);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
一个不太人为的例子是这样的:
a[i++] += 1;
Run Code Online (Sandbox Code Playgroud)