正如标题所说我在一些C讲义发现这样的句子。
我不能创造任何例子证明了那句话。
在我看来,每一个赋值操作的计算一次,因为当我们希望它被评估一次,我们把在一个循环了。 我在想什么呢?
我已经搜查,但未能就使这里找到答案。
正如标题所说我在一些C讲义发现这样的句子。
我不能创造任何例子证明了那句话。
在我看来,每一个赋值操作的计算一次,因为当我们希望它被评估一次,我们把在一个循环了。 我在想什么呢?
我已经搜查,但未能就使这里找到答案。
Ç说:
(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
。
通常情况下, +=
运算符通过以下方式介绍:
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
在最后一行执行两次,而它是在第二执行一次。
你提的问题是非常明确,措辞不当,但我怀疑你的笔记是参考的是,组合的算术+赋值操作符让你做某些事情,而无需编写(从而评估),表达对左值不止一次。 例如,
*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 */
没有什么要编译具有方便,但这里是一个有趣的花絮:
var1 += var++
将VAR1的值更改为var1 + var
然而
var1 += ++var
将改变VAR1到的值var1 + (var + 1)
还有一些化合物分配操作中下例如+ =, - =,* =,/ =,%=
为例如I + = 1它通过1像我++递增i的值。
有复合赋值运算符的数量。 对于如。 +=,-=,*=,/=,%=
作为a+=b
将give a=a+b
的更多详细信息,请点击此