C:++ i 和 i ++ 有什么区别?

在 C 语言中,使用++ii++什么区别,应该在for循环的增量块中使用哪个?

答案

  • ++i将递增的值i ,然后返回增加后的值。

    i = 1;
     j = ++i;
     (i is 2, j is 2)
  • i++将增加的价值i ,而是返回原来的价值i递增之前举行。

    i = 1;
     j = i++;
     (i is 2, j is 1)

对于for循环,两者均有效。 ++i似乎更常见,也许是因为那是K&R 中使用的

无论如何,请遵循准则 “比i++更喜欢++i ”,这样就不会出错。

关于++ii++的效率,有几点评论。在任何非学生项目的编译器中,都不会有性能差异。您可以通过查看生成的代码来验证这一点,这将是相同的。

效率问题很有趣... 这是我的一个尝试: 我在 C 中的 i ++ 和 ++ i 之间是否存在性能差异?

正如On Freund 所指出的,对于 C ++ 对象而言,这是不同的,因为operator++()是一个函数,并且编译器无法知道优化临时对象的创建来保存中间值。

i ++被称为后增量,++ i被称为前增量。

i++

i++是后递增的,因为操作结束后它将i的值递增 1。

让我们看下面的例子:

int i = 1, j;
j = i++;

这里j = 1j = 1i = 2 。在这里, i值将首先分配给j然后i会增加。

++i

++i是预递增的,因为它在操作之前将i的值递增 1。这意味着j = i;将在i++之后执行。

让我们看下面的例子:

int i = 1, j;
j = ++i;

这里j = 2j = 2i = 2 。这里的价值i将被分配到ji的 incremention i 。类似地, ++i将在j=i;之前执行j=i;

对于您的问题,应该在 for 循环的增量块中使用哪个?答案是,您可以使用任何一个.. 没关系。它将执行您的 for 循环相同的编号。的时间。

for(i=0; i<5; i++)
   printf("%d ",i);

for(i=0; i<5; ++i)
   printf("%d ",i);

两个循环将产生相同的输出。即0 1 2 3 4

仅在您使用它的地方重要。

for(i = 0; i<5;)
    printf("%d ",++i);

在这种情况下,输出将为1 2 3 4 5

请不要担心其中哪一个更快的 “效率”(速度)。这些天,我们有负责这些事情的编译器。使用任何一种有意义的方法,在此基础上可以更清楚地表明您的意图。

++i递增该值,然后将其返回。

i++返回该值,然后将其递增。

这是一个微妙的区别。

对于 for 循环,请使用++i ,因为它速度稍快。 i++将创建一个多余的副本,该副本将被丢弃。

i++ :在这种情况下,首先分配值,然后进行递增。

++i :在这种情况下,首先完成增量,然后分配值

下面是图像的可视化效果, 这也是一个演示相同内容的实用视频

在此处输入图片说明

++i 可能i++快一点的原因是, i++在 i 值递增之前可能需要 i 值的本地副本,而++i则不需要。在某些情况下,某些编译器会在可能的情况下对其进行优化…… 但并非总是如此,并非所有编译器都这样做。

我尽量不要过分依赖编译器优化,因此我会遵循 Ryan Fox 的建议:当我可以同时使用两者时,我会使用++i

使用任一个的有效结果是相同的。换句话说,循环将在两种情况下执行相同的操作。

在效率方面,选择 i ++ 而不是 ++ i 可能会涉及罚款。根据语言规范,使用后递增运算符应创建该运算符所作用的值的额外副本。这可能是额外操作的来源。

但是,您应该考虑上述逻辑的两个主要问题。

  1. 现代编译器很棒。所有优秀的编译器都非常聪明,足以意识到它在 for 循环中看到整数增量,并且会将这两种方法优化为相同的有效代码。如果使用后增量而不是前增量实际上导致程序运行时间变慢,则说明您使用的是可怕的编译器。

  2. 就操作时间复杂度而言,这两种方法(即使实际上正在执行复制)也是等效的。在循环内部执行的指令数应主要控制增量操作中的操作数。因此,在任何大小较大的循环中,执行循环体都会大大增加增量方法的代价。换句话说,您最好不用担心在循环中优化代码,而不必担心增量。

在我看来,整个问题可以归结为对样式的偏爱。如果您认为预增量更具可读性,请使用它。就个人而言,我更喜欢后期添加,但这可能是因为在我对优化一无所知之前这就是我所教过的。

这是过早优化的典型例子,而这样的问题可能会分散我们对设计中严重问题的注意力。但是,仍然要问一个好问题,因为在 “最佳实践” 中用法或共识并不一致。

它们都增加数字。 ++i等于i = i + 1

i++++i非常相似,但不完全相同。两者都增加数字,但是++i增加对当前表达式求值之前的数字,而i++增加对表达式求值之后的数字。

例:

int i = 1;
int x = i++; //x is 1, i is 2
int y = ++i; //y is 3, i is 3

++i :是前递增,另一个是后递增。

i++ :获取元素,然后递增。
++i :使++i递增,然后返回该元素。

例:

int i = 0;
printf("i: %d\n", i);
printf("i++: %d\n", i++);
printf("++i: %d\n", ++i);

输出:

i: 0
i++: 0
++i: 2

++i (前缀操作):递增,然后分配值
(例如): int i = 5int b = ++i在这种情况下,首先将 6 分配给 b,然后递增到 7,依此类推。

i++ (后缀操作):分配然后递增值
(例如): int i = 5int b = i++在这种情况下,首先将 5 分配给 b,然后递增到 6,依此类推。

在 for 循环的情况下:最常使用i++是因为,通常我们在递增 for 循环之前使用i的起始值。但是,根据您的程序逻辑,它可能会有所不同。