算术赋值运算符 - 左侧只计算一次(Arithmetic assignment operator -

2019-06-27 10:14发布

正如标题所说我在一些C讲义发现这样的句子。

我不能创造任何例子证明了那句话。

在我看来,每一个赋值操作的计算一次,因为当我们希望它被评估一次,我们把在一个循环了。 我在想什么呢?

我已经搜查,但未能就使这里找到答案。

Answer 1:

Ç说:

(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;

这当然是不同的(和未定义的行为BTW)。

实施例2:

*foo() += 1;

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

实施例3:

REG |= 0x01;

假设REG这里是一个IO寄存器(类似#define REG (*(volatile uint8_t *) 0x42)而且每读这个特定的IO寄存器触发硬件事件。 该寄存器将与复合赋值操作符中读出一次,而不是两次。

编辑 :以下@R。 发表评论我删除线的例子3.我想大多数编译器不会在这个表达式执行读: REG = 31或两个与此表达写着: REG = REG | 0x01 REG = REG | 0x01



Answer 2:

通常情况下, +=运算符通过以下方式介绍:

x += y;
x = x+y; // does the same

但是,该说明试图告诉你,其实这是不准确的,因为左侧=+=可能是任意表达式。 正如其他人指出,这可能导致未定义的行为,但是这不是问题的核心。

例如:

char* f() {
  static char value = 'a';
  printf("%c\n",value);
  return &value;
}

void g() {
  *f() = 'b'; // assigns 'b' which was 'a'
  *f() += 2; // changes 'b' to 'd'
  *f() = 'b';
  *f() = *f() + 2; // changes 'b' to 'd'
}

不同的是, f在最后一行执行两次,而它是在第二执行一次。



Answer 3:

你提的问题是非常明确,措辞不当,但我怀疑你的笔记是参考的是,组合的算术+赋值操作符让你做某些事情,而无需编写(从而评估),表达对左值不止一次。 例如,

*p++ += *q++;  /* p is incremented once, as desired */
*p++ = *p++ + *q++;  /* undefined behavior */

当你在宏来使用这些,例如它特别重要:

#define ACCUM(d,s) (d)+=(s) /* good */
#define ACCUM(d,s) (d)=(d)+(s) /* dangerous */


Answer 4:

没有什么要编译具有方便,但这里是一个有趣的花絮:

var1 += var++将VAR1的值更改为var1 + var

然而

var1 += ++var将改变VAR1到的值var1 + (var + 1)



Answer 5:

还有一些化合物分配操作中下例如+ =, - =,* =,/ =,%=

为例如I + = 1通过1我++递增i的值



Answer 6:

有复合赋值运算符的数量。 对于如。 +=,-=,*=,/=,%=

作为a+=bgive a=a+b的更多详细信息,请点击此



文章来源: Arithmetic assignment operator - left side evaluated only once