gpt4 book ai didi

c - 算术赋值运算符 - 左侧仅计算一次

转载 作者:太空狗 更新时间:2023-10-29 15:55:36 25 4
gpt4 key购买 nike

正如标题所说,我在一些C讲义上找到了这样一句话。

我无法发明任何例子来证明这句话。

在我看来,每个赋值操作都被评估一次,因为当我们希望它被评估不止一次时,我们会进入一个循环。那我错过了什么?

我已经搜索过,但在 SO 上找不到答案。

最佳答案

C 说:

(C99, 6.5.16.2p3) "A compound assignment of the form E1 op= E2 differs from the simple assignment expression E1 = E1 op (E2) only in that the lvalue E1 is evaluated only once."

以下是其重要性的一些示例:

示例 1:

 a[i++] += 1;

等同于:

 a[i] = a[i] + 1; i++;

因为 += 的左操作数被求值一次。

如果它没有评估一次,它将与:

a[i++] = a[i++] + 1;

这当然是不同的(顺便说一句,还有未定义的行为)。

示例 2:

*foo() += 1;

假设 foo 返回一个指向标量类型对象的指针并产生副作用(例如它在终端上打印一个字符串)。使用复合赋值运算符,它只会打印一次字符串,而不是两次。

示例 3:

REG |= 0x01;

假设 REG 是一个 IO 寄存器(类似于 #define REG (*(volatile uint8_t *) 0x42))并且每个读取这个特定的 IO 寄存器会触发一个硬件事件。使用复合赋值运算符,寄存器将只被读取一次,而不是两次。

编辑:关注@R.注释 我在示例 3 中打了个勾。我认为大多数编译器不会在这个表达式中执行一次读取:REG = 31 或使用这个表达式进行两次读取:REG = REG | 0x01

关于c - 算术赋值运算符 - 左侧仅计算一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12133739/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com