gpt4 book ai didi

c - : number = number + 10; and number += 10; 之间的区别

转载 作者:行者123 更新时间:2023-11-30 20:05:57 29 4
gpt4 key购买 nike

这两种格式在内存中保存结果的顺序上有什么区别吗?

number = number + 10;
number += 10;

我记得一种格式会立即保存结果,因此下一行代码可以使用新值,而对于另一种格式,下一行代码不能使用新值。我的说法是对还是错?

最佳答案

对于几乎所有实际目的,都没有区别,至少在您询问的简单情况下是这样。

C standard (链接是 N1570 草案),第 6.5.15.2 节说:

A compound assignment of the form E1 op = E2 is equivalent to the simple assignment expression E1 = E1 op (E2), except that the lvalue E1 is evaluated only once, and with respect to an indeterminately-sequenced function call, the operation of a compound assignment is a single evaluation. If E1 has an atomic type, compound assignment is a read-modify-write operation with memory_order_seq_cst memory order semantics.

(上面段落的文本格式有点棘手;+= 是单个标记,中间不能有空格。)

您可以放心地忽略其中的大部分内容。我自己也不太明白最后一句话。

相关的区别在于,如果您编写,数字将被评估两次

 number = number + 10;

并且只有一次,如果你写

 number += 10;

(每次出现在表达式中时都会计算一次。)

现在,如果表达式只是变量的名称,则没有区别。在这两种情况下,相同的值存储在 number 中,以及整个表达式的结果(被丢弃,但它可以用作更大表达式的一部分)是刚刚分配的新值。

如果number被声明为 volatile ,那么它的计算次数可能会影响程序的行为。详细信息取决于 number 的存储位置以及系统的特性。宽松地说, volatile 会抑制优化,要求编译器生成完全按照您的指示执行的代码。如果变量是与某些物理设备连接的某种特殊寄存器,则可以产生很大的差异。

如果您有一个更复杂的表达式,而不仅仅是数字,那么计算一次与两次也会产生很大的不同。例如:

int arr[100] = ...;
arr[rand() % 100] += 10;
arr[rand() % 100] = arr[rand() % 100] + 10;

第一个赋值增加了 arr 的某个随机元素的值。第二个获取 arr 的某个随机元素的值,加 10,并将结果存储在 arr 的某个其他随机元素中(或者可能是同一个),因为 rand() 每次调用时都会返回(可能)不同的结果。

但在您询问的简单情况下:

number += 10;

对比

number = number + 10;

这两个语句执行相同的操作,编译器可能会为两者生成完全相同的代码。

诸如+=之类的复合赋值运算符的主要目的是让您编写更短、更清晰的代码(两者并不总是在一起,但在本例中它们确实如此)。因为您只对单个变量进行操作,所以只能引用其名称一次是有意义的。对于更复杂的表达式,可以编写:

a[b].c[d+42]->e += 10;

而不是

a[b].c[d+42]->e = a[b].c[d-42]->e;

不必多次键入目标名称,可以降低因拼写错误而引入错误的风险。 (你注意到第二个版本中的错字了吗?)

关于c - : number = number + 10; and number += 10; 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28203579/

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