关于++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. 编译器函数实参的表达式处理顺序是从右向左。
分享到:
相关推荐
本文主要讲了关于i++和++i以及左值,右值的问题,希望对你的学习有所帮助。
本文主要讲了为什么(i++)不能做左值,而(++i)可以的原因,希望对你的学习有所帮助。
主要介绍了Java中i++与++i的区别和使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2022年优秀-I+@基于互联网的新教育学习和商务模式.pptx
基于matlab迁移学习+深度学习来实现汽车细粒度识别模型的定制+安装到iphone上(搭建一个多功能汽车识别系统).zip基于matlab迁移学习+深度学习来实现汽车细粒度识别模型的定制+安装到iphone上(搭建一个多功能汽车...
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语言,
ios学习资料 iPhone+App开发实战手册,又相关基础可以看看写的很全
主要介绍了java中的i++和++i的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
plsql_oracle+8i+编程讲义,一本新手必看的oracle学习手册
基于CI+ligerGrid最新仿金蝶ERP进库存,里面有大量的学习资源。
TwinCAT+NC+I+插补运动入门,可以系统学习twincat编程,以及数控技术,非常有价值的资料,是倍福官方的文档。
基于Yolov5和Intel_Realsense_D435i开发的物体之间三维距离测量源码+使用说明.zip 基于Yolov5和Intel_Realsense_D435i开发的物体之间三维距离测量源码+使用说明.zip 基于Yolov5和Intel_Realsense_D435i开发的物体...
这套是由php+ci+mysql开发的erp 提供大家学习,使用之前要导入数据库demo.sql, 后直接访问使用 账号密码我写在使用说明里的
你早该这么玩Excel 卷I+卷II 两本 Excel学习书籍 高清完整PDF
CI+EXTJS4开源OA办公系统PHP,CodeIgniter,extjs4,2015起初目标是走向CRM的系统,但因种种原因,各种不成熟,则仅提供学习使用。最新版可获取方式:http://www.bbhold.com/html/youeryuanjiaoan/kaiyuanchanpin/
基于STC15W404AS单片机设计的爱情心形钻戒ad设计硬件原理图+PCB+软件源码,硬件采用2层板设计,圆型板,Altium设计原理图+PCB+软件源码,可供学习设计参考, void main() { uint8 i = 0; P1M1 = 0X00; P1M0 = 0...
11.CI框架学习-实例操作CI自带验证码使用与如何扩展自定义类库(验证码) 12.CI框架学习-实例操作SESSION类使用与扩展自定义公共类与登陆验证 13 CI框架学习-实例操作后台密码修改与欢迎界面 14.CI框架学习-实例操作...
Kohonen网络是自组织竞争型神经网络的一种,该网络为无...输入节点和输出节点之间以可变权值全连接,连接权值为wij(i=1,2,…,m;j=1,2,……,n)。Kohonen 网络拓扑结构Kohonen神经网络算法工作机理为:网络学习过程中,当样
软件开发设计:PHP、应用...云计算与大数据:数据集、包括云计算平台、大数据分析、人工智能、机器学习等,云计算是一种基于互联网的计算方式,通过这种方式,共享的软硬件资源和信息可以按需提供给计算机和其他设备。
数据结构 C++/C 面试题大全集共享 学习