++ i和i ++有什么区别?
在C中,使用++i
和i++
什么区别,哪些应该用在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中使用 。
无论如何,遵循指导原则“prefer ++i
over i++
”,你就不会出错。
关于++i
和i++
的效率,有一些评论。 在任何非学生项目编译器中,不会有性能差异。 你可以通过查看生成的代码来validation,这将是相同的。
效率问题是有趣的…这是我的一个答案的尝试: 是否有性能差异之间的C + +我在i + +?
至于Freund笔记,对于C ++对象来说是不同的,因为operator++()
是一个函数,编译器不知道如何优化临时对象的创build来保存中间值。
i ++被称为Post Increment,而++ i被称为Pre Increment。
i++
i++
是后增量,因为它操作结束后, i
的值增加1。
让我们看看下面的例子:
int i = 1, j; j = i++;
这里j = 1
值,但是i = 2
。 在这里, i
价值将被分配给第一,然后i
会增加。
++i
++i
是预先增量,因为它在操作之前将i
的值增加1。 这意味着j = i;
将在i++
之后执行。
让我们看看下面的例子:
int i = 1, j; j = ++i;
这里j = 2
值,但是i = 2
。 这里i
价值将被分配给j
后, i
增量。 同样, ++i
会在j=i;
之前执行j=i;
。
对于你应该在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++
会创build一个额外的副本,只是被扔掉。
我++: – 在这种情况下,首先分配的值,然后增量发生。
++ i: – 在这种情况下,首先完成增量,然后赋值
下面是图像可视化,这里也是一个不错的实用video( http://www.youtube.com/watch?v=lrtcfgbUXm4 ),它演示了相同的。
原因++i
可以比i++
稍微快一点,就是i++
可以要求我的值的本地副本在它增加之前,而++i
从来没有。 在某些情况下,如果可能的话,一些编译器会优化它,但并不总是可能的,并不是所有的编译器都这么做。
我尽量不要过分依赖编译器的优化,所以我会遵循Ryan Fox的build议:当我可以同时使用时,我使用++i
。
使用的有效结果是相同的。 换句话说,循环在两种情况下都会做同样的事情。
就效率而言,在++ i上selecti ++可能会有一个惩罚。 根据语言规范,使用增量后运算符应该创build运算符所在的值的额外副本。 这可能是额外操作的来源。
但是,你应该考虑前面逻辑的两个主要问题。
-
现代编译器是伟大的。 所有优秀的编译器都足够聪明,可以认识到它在for循环中看到了一个整数增量,并且它会将这两个方法优化为相同的高效代码。 如果使用后递增实际上导致您的程序有一个较慢的运行时间,那么你正在使用一个可怕的编译器。
-
就操作时间复杂性而言,两种方法(即使拷贝实际上正在执行)是等价的。 在循环内部执行的指令的数量将显着地支配增量操作中的操作的数目。 因此,在任何大小的循环中,增量方法的惩罚将被循环体的执行所掩盖。 换句话说,你最好担心优化循环中的代码而不是增量。
在我看来,整个问题简直归结为一种风格偏好。 如果您认为预增量更具可读性,那就使用它。 就我个人而言,我更喜欢后期制,但这可能是因为在我知道优化的任何事情之前,就是我所教的。
这是过早优化的一个典型例子,像这样的问题有可能使我们从devise中的严重问题中分心。 然而,要问的问题仍然是一个很好的问题,因为在“最佳实践”中没有统一的用法或共识。
++ i(前缀操作):递增,然后赋值
(例如):int i = 5,int b = ++ i
在这种情况下,首先将b分配给b,然后增加到7,依此类推。
i ++(后缀操作):赋值然后递增值
(eg):int i = 5,int b = i ++
在这种情况下,5先分配给b,然后增加到6,依此类推。
for循环的incase:我主要使用i ++,因为通常我们在for循环中递增之前使用i的起始值。但取决于您的程序逻辑,它可能会有所不同。
我假设你已经理解了语义上的差异(尽pipe我真的不知道为什么人们会问'操作符X是什么意思'是堆栈溢出而不是读取的问题,你知道,一本书或者Web教程什么的。
但无论如何,就使用哪一个而言,忽略性能问题,即使在C ++中,性能问题也不可能是重要的。 这是决定使用哪一个时应该使用的原则:
在代码中说出你的意思。
如果您在声明中不需要增值前的价值,则不要使用该forms的运算符。 这是一个小问题,但是除非你正在使用一个风格指南来禁止一个版本(又名骨头风格指南),否则你应该使用最准确地expression你正在做的事情的表单。
QED,使用预增量版本:
for (int i = 0; i != X; ++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
这个差别可以通过下面这个简单的C ++代码来理解:
int i, j, k, l; i = 1; //initialize int i with 1 j = i+1; //add 1 with i and set that as the value of j. i is still 1 k = i++; //k gets the current value of i, after that i is incremented. So here i is 2, but k is 1 l = ++i; // i is incremented first and then returned. So the value of i is 3 and so does l. cout << i << ' ' << j << ' ' << k << ' '<< l << endl; return 0;
不久之后:++我和i ++的作品一样,如果你不写在一个函数。 如果你使用像函数(i ++)或函数(++ i)的东西,你可以看到不同之处。
函数(++ i)表示首先将i递增1,然后将这个i放入具有新值的函数中。
函数(i ++)表示,在将i递增1之后,首先将函数i放入函数中。
int i=4; printf("%d\n",pow(++i,2));//it prints 25 and i is 5 now i=4; printf("%d",pow(i++,2));//it prints 16 i is 5 now
主要区别在于
- i ++ Post(增量后)和
-
++我前(增量之前)
- 后,如果我= 1循环增量像1,2,3,4,n
- 如果i = 1,则循环增加如2,3,4,5,n
预加工意味着在同一条线上增加。 后续增量意味着执行该行后的增量。
int j=0; System.out.println(j); //0 System.out.println(j++); //0. post-increment. It means after this line executes j increments. int k=0; System.out.println(k); //0 System.out.println(++k); //1. pre increment. It means it increments first and then the line executes
当与OR,AND运营商,它变得更有趣。
int m=0; if((m == 0 || m++ == 0) && (m++ == 1)) { //false /* in OR condition if first line is already true then compiler doesn't check the rest. It is technique of compiler optimization */ System.out.println("post-increment "+m); } int n=0; if((n == 0 || n++ == 0) && (++n == 1)) { //true System.out.println("pre-increment "+n); //1 }
在数组中
System.out.println("In Array"); int[] a = { 55, 11, 15, 20, 25 } ; int ii, jj, kk = 1, mm; ii = ++a[1]; // ii = 12. a[1] = a[1] + 1 System.out.println(a[1]); //12 jj = a[1]++; //12 System.out.println(a[1]); //a[1] = 13 mm = a[1];//13 System.out.printf ( "\n%d %d %d\n", ii, jj, mm ) ; //12, 12, 13 for (int val: a) { System.out.print(" " +val); //55, 13, 15, 20, 25 }
在C ++ post / pre-increment指针variables中
#include <iostream> using namespace std; int main() { int x=10; int* p = &x; std::cout<<"address = "<<p<<"\n"; //prints address of x std::cout<<"address = "<<p<<"\n"; //prints (address of x) + sizeof(int) std::cout<<"address = "<<&x<<"\n"; //prints address of x std::cout<<"address = "<<++&x<<"\n"; //error. reference can't re-assign because it is fixed (immutable) }
下面的C代码片段说明了前后增量和减量运算符的区别:
int i; int j;
//增加运算符
我= 1;
j = ++ i; //我现在是2,j也是2
j = i ++; //我现在是3,j是2
a = i ++的意思是我的价值将被存储在一个不增加a = ++我的意思是i值将被存储与递增…
这里是了解差异的例子
int i=10; printf("%d %d",i++,++i);
输出: 10 12/11 11
(取决于对printf
函数的参数的评估顺序,这在编译器和体系结构中是不同的)
说明: i++
– > i
被打印,然后递增。 (打印10,但i
将成为11) ++i
– > i
值增量和打印的价值。 (打印12, i
的价值也12)