K&R 书中指出使用赋值运算符只会计算表达式一次?

Azi*_*uth 3 c

我正在阅读《K&R C 编程语言》,第 2.10 章中指出:

“如果 expr1 和 expr2 是表达式,那么

expr1 op= expr2
Run Code Online (Sandbox Code Playgroud)

相当于

expr1 = (expr1) op (expr2)
Run Code Online (Sandbox Code Playgroud)

除了 expr1 仅计算一次。”

op=指的是可以与赋值一起使用的二元运算符+=-=例如 等(并且在第二行中 op 仅表示二元运算符,例如+

我的第一个小困惑是它expr1必须只是一个变量(“左值”)?否则我们如何将结果分配给更大的表达式?expr1但我的主要问题是“仅计算一次”是什么意思?如果我们写:

expr1 = (expr1) op (expr2)
Run Code Online (Sandbox Code Playgroud)

代替

expr1 op= expr2 
Run Code Online (Sandbox Code Playgroud)

Wil*_*ell 5

这感觉很做作,但请考虑一下:

#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)