C ++;我和我+=1从任何角度来看
这是kn king的c编程中的一个问题:现代方法。我无法理解他给出的解决方案:-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周围的括号确保即使上下文包含进一步的算术运算
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
其中asX=++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编译器。