C ++;我和我+=1从任何角度来看

C ++;我和我+=1从任何角度来看,c,operators,C,Operators,这是kn king的c编程中的一个问题:现代方法。我无法理解他给出的解决方案:- The expression ++i is equivalent to (i += 1). The value of both expressions is i after the increment has been performed. 我怎么理解这个呢 解决方案意味着说没有区别,++i与(i+=1)具有相同的含义,无论i是什么,也不管表达式的上下文如何。i+=1周围的括号确保即使上下文包含进一步的算术运算

这是kn king的c编程中的一个问题:现代方法。我无法理解他给出的解决方案:-

The expression ++i is equivalent to (i += 1). The value of both expressions is i after 
the increment has been performed.

我怎么理解这个呢

解决方案意味着说没有区别,
++i
(i+=1)
具有相同的含义,无论
i
是什么,也不管表达式的上下文如何。
i+=1
周围的括号确保即使上下文包含进一步的算术运算,也能保持等价性,例如
++i*3
相当于
(i+=1)*3
,而不是
i+=1*3
(相当于
i+=3


这一点不适用于具有相同副作用(递增
i
)的
i++
,但在周围的表达式中有一个不同的值-递增前的
i
值。

++i
是递增前的运算符。它在设置和返回值(显然是
i+1
)之前递增
i

现在,
i++
是后增量运算符。在计算它出现在其中的整个指令后,它将递增
i

例如:

int i = 0;
std::cout << ++i << std::endl; /* you get 1 here */
std::cout << i++ << std::endl; /* you still get 1 here */
std::cout << i << std::endl;   /* you get 2 here */
inti=0;
标准::cout
将打印10,其中

printf("%d", ++i);
将打印11

X=i++
可以这样认为

X = i
i = i + 1
其中as
X=++i

i = i + 1
X = i
所以

printf ("%d", i += 1);
但不是

printf ("%d", i++);

尽管在这三个语句中的任何一个之后,
i
的值都是相同的。

我认为它们是完全相同的。有一件事可能很有趣。++i等于(i+=1),但不等于i+=1;区别在于大括号。因为i+=1可能取决于上下文,它将有不同的解释

在无分配的正常操作中:

++我和我++

在1中增加变量。在伪汇编代码中,它是:

inc i
但是,如果指定该值,++的顺序是相关的:

x=i++

制作:

mov x, i
inc i
inc i
mov x, i
x=++i

制作:

mov x, i
inc i
inc i
mov x, i
在下列情况下: i+=1

它将产生:

add i,1
但由于编译器优化了代码,因此在这种情况下也会生成:

inc i

到目前为止还没有提到的一个区别是代码的可读性。大部分循环使用递增1,通常的做法是在移动到下一个元素/将索引递增1时使用i++/++i


通常,只有当增量不是1时,才会在这些情况下使用i+=。将其用于正常增量不会有危险,但会引起理解上的轻微碰撞,并使代码看起来异常。

两者之间的区别是:++是一元运算符,而+是二元运算符。。。。 <强>如果考虑执行时间:< /强> <代码> i++比i= i+1要快得多。< /代码> 执行同一组代码时,没有不同的机器循环,这就是为什么循环总是首选++运算符的原因。

你不明白它的哪一部分?假设如果
i=10
,那么在
i+=1
之后,
i
变成
11
。你错在
++i
i++
,我要举个例子。@skp:你在问题的任何地方看到“i++”了吗?问题被标记为
C
,而不是
C++
。而且问题不涉及后增量。更重要的是,这个答案中的“之前”和“之后”这两个词并不能反映C中增量前后的实际情况(代码可能>不在C++中)。<代码> i> +代码>在最后一个和下一个序列点之间的任何时间,计算“<代码> i <代码>,递增<代码> i <代码>,程序不允许尝试观察。但是<代码> i+++ 1 总是等同于<代码> ++i 和<代码> I+= 1 < /代码>。操作员签名相同。它们都返回int&.@user2672165:C中没有
int&
这样的东西。C中确实没有引用类型,但是,表达式将返回一个<代码> int /COD>类型的L值,其存储由变量<代码> > <代码>。@ NoClOract No.C++ > + I/COD>和<代码> I++<代码>不是C中的LValk。C标准在明确定义左值方面不是很好,所以我不提供参考,但询问任何C编译器。