关于++i和i++的区别,如果用一个函数来说明,则它们分别等价于下面两个函数:
++i:
C/C++ code
int ppi(int & i)
{
i = i + 1;
return i;
}
i++:
C/C++ code
int ipp(int & i)
{
int t = i;
i = i + 1;
return t;
}
显见,两个函数都将i的值加了1,但返回的值却不一样。另外,ipp比ppi多了
C/C++ code
int t = i;
这步,所以++i的效率要比i++高一点。
--i和i--与此同理。
第二个问题: cout和printf多个输出时++i和i++的区别?
就是关于
cout<<i<<” “<<++i<<endl;与cout<<i<<” “<<i++<<endl;的区别
cout<<i<<” ”<<++i<<endl;与cout<<i<<” ”; cout<<++i<<endl;的区别
下面以一个例程来说明这个问题:
C/C++ code
#include <stdio.h>
#include <iostream.h>
int main(void)
{
int i = 0;
cout << "Test execute order: " << endl
<< "cout: "
<< i << ", " << ++i << endl;
i = 0;
printf("printf(): %d, %d\n", i, ++i);
return0;
}
这段代码在VC6.0、BC3.1下的执行结果是:
Test execute order:
cout: 1, 1
printf(): 1, 1
cout < < 实际上是执行了cout对象的重载操作符( < <)函数:
C/C++ code
ostream& operator<<( datatype );
这里的datatype是只相应的数据类型。该函数的调用之所以能写成cout < < "a" < < 3 < < "b" < < endl;这种拼接输出的形式,是因为它返回的是cout这个ostream对象本身,而返回的cout对象继续调用上面函数对下一个操作数进行输出,如此反复,直到该语句结束(当然,遇到刷新缓冲区的命令时还得先刷新)。由此可知,cout的执行顺序是从左到右的。
至于为什么i的值先被改变了呢?那是因为,C++标准对表达式的求解顺序不作规定,交给编译器决定。因此,各个编译器的实现也有点差异。例如,上面那个例程如果在gcc(g++)下执行的话,结果则是:
Test execute order:
cout: 0, 1
printf(): 1, 1
由此可知,VC、BC和gcc(g++)对这种拼接形式的表达式求解顺序不一样,后者是从左到右,前者是保持跟函数的顺序一样,即都是从右到左。而两者在对函数实参的表达式求解顺序却都是一样,即都是从右到左(看printf()的输出)。
因此。编程忠告不建议在同一个表达式里面同时修改同一个变量。
在平台:sparc-sun-solaris2.10-g++ (GCC) 4.0.3 (gccfss),结果是:
Test execute order:
cout: 0, 1
printf(): 1, 1
在平台:g++ (GCC) 3.4.6 20060404 (Red Hat 3.4.6-3),结果是:
Test execute order:
cout: 1, 1
printf(): 1, 1
这恰恰再次印证了“表达式求值顺序未定义”结论的正确性。
总结一下:
关于i++和++i:
1.二者都对i加1,但处理的顺序不同。i++先对i作相关运算,然后加1。++i先递增,然后再进行相关运算。
2.单独使用时,++i的效率要比i++效率高。
关于cout<<i<<i++<<endl;和cout<<i<<++i<<endl;有:
1. Cout是对<<运算符的重载,返回的是cout这个ostream对象本身。<<连续使用时,返回的cout对象继续调用上面函数对下一个操作数进行输出,如此反复,直到该语句结束。因此,cout执行顺序是从左到右。
2. C++标准对表达式的求解顺序不作规定,根据编译器不同而不同。因此,在不同的编译器环境下,cout<<i<<++i<<endl;输出并不总是按照cout从左到右的顺序执行。
3. 编译器函数实参的表达式处理顺序是从右向左。
分享到:
相关推荐
在C#编程语言中,`i++` 和 `++i` 是两种常见的增量运算符,它们都用于将变量的值增加1。然而,虽然这两者看似相似,但在语义上存在细微差别,尤其是在某些特定上下文中。理解这些差异对于编写高效、清晰的代码至关...
本案例中,我们将学习如何使用C#语言来解决多线程问题,特别是解决i++操作符在多线程环境下的问题。 多线程编程是C#编程语言的重要特性,它允许程序同时执行多个任务来提高程序的执行效率。然而,在多线程编程中,...
内容概要:本文通过三个版本的示例代码详细介绍了C++中前缀自增++i和后缀自增i++的区别及其具体应用场景。从初学者友好版本逐渐过渡到可选择自增方式的互动版,再到针对数据结构中使用的进阶版本。通过对每个版本的...
"画质增强器i+++++++++++"可能是一款专注于提升图像和视频质量的软件工具,尤其在人工智能(AI)技术的支持下,它能实现对老旧、低分辨率或受损媒体内容的智能优化。下面将详细探讨相关知识点。 1. **人工智能在...
在编程中,我们经常使用迭代器来遍历数组或容器,但是我们有时候不知道使用前自增运算符(++i)和后自增运算符(i++)的区别。今天,我们来学习这个小知识,了解为什么我们应该使用++i来代替i++。 首先,让我们来看...
内容概要:本文详细介绍了前置自增(++i)和后置自增(i++)运算符的区别及其应用场景,涵盖C/C++、Java、JavaScript等多门语言。重点讨论了两者在返回值、执行顺序以及在复杂表达式中的差异,并探讨了编译器优化的...
内容概要:详细讲解了在C、C++、Java、JavaScript等多种编程语言里,前缀递增(++i)与后缀递增(i++)的具体区别及其使用时机。文章指出两者虽然最终都使变量增加了1,但在复合表达式中因为执行顺序的不同会产生...
在Java编程语言中,`i=3; a=i++; i+=a;` 是一段涉及到变量赋值和自增操作的代码。这段代码包含了几个关键的知识点,我们将逐一深入讲解。...因此,不断学习和熟练掌握编程基本概念对于任何Java开发者来说都至关重要。
相较于传统搜索引擎,I++专注于房地产领域,具有更强的专业性和针对性;通过技术创新,提供更优质的服务,有望在市场中占据一席之地。 六、营销与推广策略 1. 线上推广:利用社交媒体、行业网站进行广告投放,提高...
1.#include <stdio.h> 2.#include <stdlib.h> 3.void loopMove(char *pStr,int steps) 4.{ 5. int length=0,i=0; 6. char *sub=pStr,*str; 7. 8. while (*pStr!...18. for (i=0;...这能帮揍你们学习C语言,
《TwinCAT+NC+I+插补运动入门V1.03》是一份深入学习倍福(Beckhoff)TwinCAT系统中数控(NC)插补运动控制的宝贵资料,适合对自动化技术和数控编程感兴趣的工程师。TwinCAT是倍福公司开发的一款基于Windows的PLC(可...
在实际编程中,杨辉三角的实现可以用于学习和理解递归、动态规划以及数组操作等概念。此外,它还可以用于生成多项式的二项展开式,例如 `(a + b)^n` 的展开式系数可以通过查看杨辉三角的第n行得到。 总之,Java实现...
基于PHP、MySQL等技术构建的web系统,框架,PHP学习,课程设计作业,可用于毕业设计,源码项目,可直接运行,实测! 基于PHP、MySQL等技术构建的web系统,框架,PHP学习,课程设计作业,可用于毕业设计,源码项目,...
例如,"(++i)+(++i)"和"(i++)+(i++)"等表达式,它们的计算结果取决于运算符的结合性和优先级。 对于"(++i)+(++i)",由于预增量操作符"++"有较高的优先级,因此会先对每个"++i"进行操作,然后再做加法。这意味着在每...
基于CI+ligerGrid最新仿金蝶ERP进库存,里面有大量的学习资源。
这套是由php+ci+mysql开发的erp 提供大家学习,使用之前要导入数据库demo.sql, 后直接访问使用 账号密码我写在使用说明里的
基于Yolov5和Intel_Realsense_D435i开发的物体之间三维距离测量源码+使用说明.zip 基于Yolov5和Intel_Realsense_D435i开发的物体之间三维距离测量源码+使用说明.zip 基于Yolov5和Intel_Realsense_D435i开发的物体...
使用vue全家桶+express+php ci+Mysql实现的电影图书查询APP,使用豆瓣API - 不懂运行,下载完可以私聊问,可远程教学 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目...
CI+EXTJS4开源OA办公系统PHP,CodeIgniter,extjs4,2015起初目标是走向CRM的系统,但因种种原因,各种不成熟,则仅提供学习使用。最新版可获取方式:http://www.bbhold.com/html/youeryuanjiaoan/kaiyuanchanpin/
具体地,对于每一个元素C[i][j],它的值为A的第i行与B的第j列对应元素的乘积之和,数学表达式如下: \[ (AB)[i,j] = A[i,1] \times B[1,j] + A[i,2] \times B[2,j] + \cdots + A[i,n] \times B[n,j] \] 或者简写为...