以C+递增+;-何时使用x++;或++;x? 我现在正在学习C++,不久前我就知道了增量。 我知道你可以用“++x”在之前进行递增,用“x++”在之后进行递增

以C+递增+;-何时使用x++;或++;x? 我现在正在学习C++,不久前我就知道了增量。 我知道你可以用“++x”在之前进行递增,用“x++”在之后进行递增,c++,post-increment,pre-increment,C++,Post Increment,Pre Increment,不过,我真的不知道什么时候使用这两个。。。我从来没有真正使用过“++x”,到目前为止,一切都很好——那么,我应该什么时候使用它呢 示例:在for循环中,何时最好使用“++x” 还有,有人能确切地解释一下不同的递增(或递减)是如何工作的吗?我非常感谢。这不是偏好的问题,而是逻辑的问题 x++在处理当前语句后,增加变量x的值 ++x在处理当前语句之前,递增变量x的值 所以只要决定你写的逻辑就行了 x++=++i将增加i,并将i+1添加到x。 x+=i++将i添加到x中,然后增加i。告诉您首选前缀,除

不过,我真的不知道什么时候使用这两个。。。我从来没有真正使用过“++x”,到目前为止,一切都很好——那么,我应该什么时候使用它呢

示例:在for循环中,何时最好使用“++x”


还有,有人能确切地解释一下不同的递增(或递减)是如何工作的吗?我非常感谢。

这不是偏好的问题,而是逻辑的问题

x++
在处理当前语句后,增加变量x的值

++x
在处理当前语句之前,递增变量x的值

所以只要决定你写的逻辑就行了

x++=++i
将增加i,并将i+1添加到x。
x+=i++
将i添加到x中,然后增加i。

告诉您首选前缀,除非逻辑指示后缀是合适的

-这对我来说已经足够了

对于那些不拥有这本书的人,这里有一些相关的引用。第32页:

从您作为C程序员的日子里,您可能还记得增量运算符的前缀形式有时被称为“增量和获取”,而后缀形式通常被称为“获取和增量”。这两个短语需要记住,因为它们几乎都是形式规范

第34页:

如果你是那种担心效率的人,那么当你第一次看到后缀增量函数时,你可能会大汗淋漓。该函数必须为其返回值创建一个临时对象,上面的实现还创建一个显式的临时对象,该对象必须被构造和销毁。前缀增量函数没有这样的临时变量


你正确地解释了差异。它只取决于您希望x在每次运行循环之前或之后递增。这取决于你的程序逻辑,什么是合适的

处理STL迭代器(也实现这些运算符)时的一个重要区别是,它创建迭代器指向的对象的副本,然后递增,然后返回副本++另一方面,它首先执行增量,然后返回对迭代器现在指向的对象的引用。当每一点性能都很重要时,或者当您实现自己的STL迭代器时,这通常是相关的


编辑:修复了前缀和后缀符号的混淆问题

我同意@BeowulfOF,不过为了清楚起见,我一直主张拆分语句,以便逻辑绝对清晰,即:

i++;
x += i;


因此,我的答案是,如果您编写清晰的代码,那么这应该很少有关系(如果有关系,那么您的代码可能不够清晰)。

只是想再次强调,++x应该比x++更快(特别是如果x是某种任意类型的对象),因此除非出于逻辑原因需要,应使用++x

从递增迭代器开始:

您应该更喜欢预增量 运算符(++iter)到后增量 操作员(iter++),如果您不去 使用旧值。增量后 一般实施如下:

显然,它的效率不如 增量前


预增量不会生成临时对象。如果创建对象的成本很高,那么这可能会产生显著的差异。

我只想注意,如果使用pre/post增量,而语义(pre/post)并不重要,那么生成的代码通常是相同的

例如:

前cpp:

#include <iostream>

int main()
{
  int i = 13;
  i++;
  for (; i < 42; i++)
    {
      std::cout << i << std::endl;
    }
}
#包括
int main()
{
int i=13;
i++;
对于(;i<42;i++)
{
std::cout.file“post.cpp”

我要记住的最重要的一点是,x++需要在实际发生增量之前返回值——因此,它必须创建对象的临时副本(预增量)。这比就地递增并返回的++x效率低

不过,另一件值得一提的事情是,大多数编译器将能够在可能的情况下优化这些不必要的东西,例如,这两个选项将导致相同的代码:

for (int i(0);i<10;++i)
for (int i(0);i<10;i++)

<代码> >(int i(0);i在理解代码清晰时理解语言语法是重要的。考虑复制字符串,例如用PosialPosi:

char a[256] = "Hello world!";
char b[256];
int i = 0;
do {
  b[i] = a[i];
} while (a[i++]);
我们希望通过在字符串末尾遇到零字符(测试为false)来执行循环。这需要测试值pre increment并同时递增索引。但不一定要按此顺序-使用pre increment对其进行编码的方法是:

int i = -1;
do {
  ++i;
  b[i] = a[i];
} while (a[i]);
这是一个更清晰的味道问题,如果机器有大量寄存器,则两者的执行时间应该相同,即使[i]是一个昂贵或有副作用的函数。一个显著的差异可能是索引的退出值

后缀形式的++,--运算符遵循规则使用然后更改

前缀形式(++x,--x)遵循规则更改然后使用

例1:
当多个值与级联时,您要求提供一个示例:

这(
order
是一个std::vector)将在
order[i].size()上的
i==order.size()-1
崩溃

while(i++ < order.size() && order[i].size() > currLvl);

请注意,在for循环中,在primatives上,这是绝对没有区别的。许多编码风格都会建议不要在可能被误解的地方使用增量运算符;例如,x++或++x应该只存在于它自己的行中,永远不要作为y=x++。我个人不喜欢这样,但它是不常见的。如果在它自己的行中使用,则生成的co德几乎肯定是一样的。这可能是真的
for (int i(0);i<10;++i)
for (int i(0);i<10;i++)
char a[256] = "Hello world!";
char b[256];
int i = 0;
do {
  b[i] = a[i];
} while (a[i++]);
int i = -1;
do {
  ++i;
  b[i] = a[i];
} while (a[i]);
 cout<< ++val<<" "<< val++<<" "<< val;
12    10    10 
int a=10,b;
b=a++ + ++a + ++a + a;
cout<<b<<a<<endl;
48 13
45 13
while(i++ < order.size() && order[i].size() > currLvl);
while(++i < order.size() && order[i].size() > currLvl);