本文主要是介绍趣谈 i++ ++i i-- --i,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
给大家介绍几个自增自减运算符的小例子,希望大家对其分析有所帮助,
i++、++i 的区别:如果做为单独的一条语句它们没有区别,结果都一样;
其他情况则有区别:如 int i = 2;int b; b = i++; 和另一种情况b = ++i;是完全不一样的,b=i++,结果是b=2,i=3; 而b=++i;结果是b=3,i=3.由此可以看出它们之间的区
别,一个是先赋值再计算,另一个则是先计算再赋值。
i--,--i 同样也是这个道理。
一、第一个小例子
/*VC 、turboc3.0 、 visual Studio 中结果都一样*/
#include <stdio.h>
int main(int argc, char *argv[])
{
int a = 1;
int b = 2;
int c;
c = (a++) + (b++) + 3; /*即:首先 c = a + b + 3; 然后 a++,b++*/
printf("a = %d b = %d c = %d\n",a,b, c);
}
二、第二个小例子
/*VC 、turboc3.0 、 visual Studio 中结果都一样*/
#include <stdio.h>
int main(int argc, char *argv[])
{
int a = 1;
int b = 2;
int c;
c = (++a) + (++b) + 3; /*即:首先 ++a,++b ; 然后 c = a + b + 3*/
printf("a = %d b = %d c = %d\n",a,b ,c);
return 0;
}
三、第三个小例子
/*turboc3.0 、 visual Studio 中结果都一样*/
#include <stdio.h>
int main(int argc, char *argv[])
{
int a = 1;
/*turboc3.0 、 visual Studion 中结果都一样
1、首先计算:++a,++a,++a;
2、在计算:a = 4 + 4 + 4;
3、最后:a = 12.
*/
a = (++a) + (++a) + (++a);
printf("a = %d\n",a);
return 0;
}
/*VC 中测试*/
#include <stdio.h>
int main(int argc, char *argv[])
{
int a = 1;
/*VC中测试,其实是两个两个分组,然后对这组数据进行++a计算,其后面每个组的a都受前一组的值影响,而不是最原始的值
1、首先计算:++a,++a
2、再计算 a = 3 + 3 + (++a);
3、再计算 ++a;(注意此时的a=3)
4、再计算 a = 3 + 3 + 4;
5、最后 a = 10
*/
a = (++a) + (++a) + (++a);
printf("a = %d\n",a);
return 0;
}
四、第四个小例子
/*VC 、turboc3.0 、 visual Studio 中结果都一样*/
#include <stdio.h>
int main(int argc, char *argv[])
{
int a = 1;
int b;
/*
1、首先 b = 1 + 1 + 1
2、然后 a++,a++ ,a++
3、结果 b = 3,a = 4
*/
b = (a++) + (a++) + (a++);
printf("a = %d b = %d\n",a,b);
return 0;
}
五、第五个小例子
/*VC 、turboc3.0 、 visual Studio 中结果都一样*/
#include <stdio.h>
int main(int argc, char *argv[])
{
int a = 1;
int b;
/*在Visual Studio中的测试,注意应该从表达式的整体考虑,先计算所有的++a,然后在计算表达式,而此时的a++中的a是经过++a的到的值,不是最初的原始值
1、首先 ++a,++a;
2、然后 b = 3 + 3 + 3;(注意这里a++的a不是最原始的a,而是经过++a计算后的a)
3、然后 a++;
4、结果 a = 4,b = 9
*/
b = (++a) + (++a) + (a++);
printf("a = %d b = %d\n",a,b);
return 0;
}
六、第六个小例子
/*turboc3.0 、 visual Studio 中结果都一样*/
#include <stdio.h>
int main(int argc, char *argv[])
{
int a = 1;
int b;
/*注意应该从表达式的整体考虑,先计算所有的++a,然后在计算表达式,而此时的a++中的a是经过++a的到的值,不是最初的原始值
1、首先 ++a,++a;
2、然后 b = 3 + 3 + 3;(注意这里a++的a不是最原始的a,而是经过++a计算后的a)
3、然后 a++;
4、结果 a = 4,b = 9
*/
b = (++a) + (a++) + (++a);
printf("a = %d b = %d\n",a,b);
return 0;
}
/*VC 中测试*/
int main(int argc, char *argv[])
{
int a = 1;
int b;
/*VC中测试,其实是两个两个分组,然后对这组数据进行++a计算,其后面每个组的a都受前一组的值影响,而不是最原始的值
1、首先 ++a
2、然后 b = 2 + 2 + (++a)
3、然后 ++a;
4、然后 b = 2 + 2 + 3;
5、最后 a = 4,b = 7
*/
b = (++a) + (a++) + (++a);
printf("a = %d b = %d\n",a,b);
return 0;
}
七、第七个小例子
/*VC 中测试*/
#include <stdio.h>
int main(int argc, char *argv[])
{
int a = 1;
int b = 2;
int c;
/*VC中测试,其实是两个两个分组,然后对这组数据进行++a计算,其后面每个组的a都受前一组的值影响,而不是最原始的值
1、首先 c = 1 + 2 + 3 + (++a) + (++b)
2、再计算 ++a , ++ b
3、再计算 c = 1 + 2 + 3 + 2 + 3
4、结果:a = 3,b = 4,c = 11
*/
c = (a++) + (b++) + 3 + (++a) + (++b);
printf("a = %d b = %d c = %d\n",a,b ,c);
return 0;
}
/*turboc3.0 、 visual Studio 中结果都一样*/
#include <stdio.h>
int main(int argc, char *argv[])
{
int a = 1;
int b = 2;
int c;
/*注意应该从表达式的整体考虑,先计算所有的++a,然后在计算表达式,而此时的a++中的a是经过++a的到的值,不是最初的原始值
1、首先 ++a,++b;
2、在计算 c = 2 + 3 + 3 + 2 + 3;
3、再计算:a++,b++;
4、结果:a = 3,b = 4,c = 13
*/
c = (a++) + (b++) + 3 + (++a) + (++b);
printf("a = %d b = %d c = %d\n",a,b ,c);
return 0;
}
最后几点注意事项:
1、可以因为编译器不一样在表达式求值时,结果可能有些差别,所以尽量在表达式中少用;
2、自增、自减运算符要比赋值运算符效率高(因为底层可以用一条汇编指令即可完成,如i++,对于汇编 inc i,而i = i + 1对应的汇编指令相应要多一些);
3、自增、自减运算符只能用于变量,不能用于常量和表达式(就是一个值),如:2++,(a+b)++非法;
4、++ 和 -- 的优先级要高于算术运算符,结合性“从右向左”,如:-a++ 相当于 -(a++);
5、一般自增、自减运算符通常用于循环控制变量和指针变量当中。
这篇关于趣谈 i++ ++i i-- --i的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!