正如标题所说,我在一些C讲义中发现了这样一句话。
我无法发明任何例子来证明这句话。
在我看来,每个赋值操作都会被评估一次,因为当我们希望它被评估多次时,我们会放入一个循环中。那我还缺少什么呢?
我已经搜索过,但在这里找不到答案。
C says:
(C99, 6.5.16.2p3) “E1 op= E2 形式的复合赋值与简单赋值表达式 E1 = E1 op (E2) 的不同之处仅在于左值 E1 仅计算一次。”
以下是一些例子来说明为什么它很重要:
示例1:
a[i++] += 1;
是相同的:
a[i] = a[i] + 1; i++;
因为左操作数+=
被评估一次。
如果不评估一次,则与以下内容相同:
a[i++] = a[i++] + 1;
这当然是不同的(顺便说一句,也是未定义的行为)。
示例2:
*foo() += 1;
假设foo
这里返回一个指向标量类型对象的指针并产生副作用(例如,它在终端上打印一个字符串)。使用复合赋值运算符,它只会打印字符串一次,而不是两次。
Example 3:
REG |= 0x01;
假设REG
这是一个 IO 寄存器(类似于#define REG (*(volatile uint8_t *) 0x42)
)并且每次读取该特定 IO 寄存器都会触发硬件事件。使用复合赋值运算符只能读取寄存器一次,而不是两次。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)