`
yangbin210
  • 浏览: 84868 次
  • 性别: Icon_minigender_1
  • 来自: 山东
最近访客 更多访客>>
社区版块
存档分类
最新评论

i++和++i的学习

阅读更多
关于++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++and++i

    在C#编程语言中,`i++` 和 `++i` 是两种常见的增量运算符,它们都用于将变量的值增加1。然而,虽然这两者看似相似,但在语义上存在细微差别,尤其是在某些特定上下文中。理解这些差异对于编写高效、清晰的代码至关...

    C#多线程问题2-简单案例-i++ c#经典案例.pdf

    本案例中,我们将学习如何使用C#语言来解决多线程问题,特别是解决i++操作符在多线程环境下的问题。 多线程编程是C#编程语言的重要特性,它允许程序同时执行多个任务来提高程序的执行效率。然而,在多线程编程中,...

    C++编程教程之自增运算符++i和i++详解

    内容概要:本文通过三个版本的示例代码详细介绍了C++中前缀自增++i和后缀自增i++的区别及其具体应用场景。从初学者友好版本逐渐过渡到可选择自增方式的互动版,再到针对数据结构中使用的进阶版本。通过对每个版本的...

    画质增强器i+++++++++++

    "画质增强器i+++++++++++"可能是一款专注于提升图像和视频质量的软件工具,尤其在人工智能(AI)技术的支持下,它能实现对老旧、低分辨率或受损媒体内容的智能优化。下面将详细探讨相关知识点。 1. **人工智能在...

    C++小知识:用++i替代i++

    在编程中,我们经常使用迭代器来遍历数组或容器,但是我们有时候不知道使用前自增运算符(++i)和后自增运算符(i++)的区别。今天,我们来学习这个小知识,了解为什么我们应该使用++i来代替i++。 首先,让我们来看...

    编程语言中++i与i++运算符的区别及性能分析

    内容概要:本文详细介绍了前置自增(++i)和后置自增(i++)运算符的区别及其应用场景,涵盖C/C++、Java、JavaScript等多门语言。重点讨论了两者在返回值、执行顺序以及在复杂表达式中的差异,并探讨了编译器优化的...

    深入解析C/C++/Java/JS中的i++与++i递增操作

    内容概要:详细讲解了在C、C++、Java、JavaScript等多种编程语言里,前缀递增(++i)与后缀递增(i++)的具体区别及其使用时机。文章指出两者虽然最终都使变量增加了1,但在复合表达式中因为执行顺序的不同会产生...

    java代码-i=3; a=i++; i+=a; \u6c42i=

    在Java编程语言中,`i=3; a=i++; i+=a;` 是一段涉及到变量赋值和自增操作的代码。这段代码包含了几个关键的知识点,我们将逐一深入讲解。...因此,不断学习和熟练掌握编程基本概念对于任何Java开发者来说都至关重要。

    I++房地产专业搜索引擎商业计划书.zip

    相较于传统搜索引擎,I++专注于房地产领域,具有更强的专业性和针对性;通过技术创新,提供更优质的服务,有望在市场中占据一席之地。 六、营销与推广策略 1. 线上推广:利用社交媒体、行业网站进行广告投放,提高...

    C语言程序设计,希望你们能来这里学习C程序

    1.#include &lt;stdio.h&gt; 2.#include &lt;stdlib.h&gt; 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

    《TwinCAT+NC+I+插补运动入门V1.03》是一份深入学习倍福(Beckhoff)TwinCAT系统中数控(NC)插补运动控制的宝贵资料,适合对自动化技术和数控编程感兴趣的工程师。TwinCAT是倍福公司开发的一款基于Windows的PLC(可...

    Java实现杨辉三角

    在实际编程中,杨辉三角的实现可以用于学习和理解递归、动态规划以及数组操作等概念。此外,它还可以用于生成多项式的二项展开式,例如 `(a + b)^n` 的展开式系数可以通过查看杨辉三角的第n行得到。 总之,Java实现...

    php基于CI+layui开发的个人博客系统(含数据库).zip

    基于PHP、MySQL等技术构建的web系统,框架,PHP学习,课程设计作业,可用于毕业设计,源码项目,可直接运行,实测! 基于PHP、MySQL等技术构建的web系统,框架,PHP学习,课程设计作业,可用于毕业设计,源码项目,...

    RTC+I2C模块+24C32存储器+DS1307时钟模块

    RTC(Real-Time Clock)是实时时钟的缩写,它是一种可以精确跟踪时间的电子设备,即使在微控制器或计算机关闭后也能...通过学习这些教程,你可以更好地理解如何在自己的Arduino项目中集成和利用这些强大的硬件组件。

    一个经验++

    例如,"(++i)+(++i)"和"(i++)+(i++)"等表达式,它们的计算结果取决于运算符的结合性和优先级。 对于"(++i)+(++i)",由于预增量操作符"++"有较高的优先级,因此会先对每个"++i"进行操作,然后再做加法。这意味着在每...

    CI+ligerGrid最新仿金蝶ERP进库存

    基于CI+ligerGrid最新仿金蝶ERP进库存,里面有大量的学习资源。

    php+ci+mysql开发的erp系统

    这套是由php+ci+mysql开发的erp 提供大家学习,使用之前要导入数据库demo.sql, 后直接访问使用 账号密码我写在使用说明里的

    基于Yolov5和Intel_Realsense_D435i开发的物体之间三维距离测量源码+使用说明.zip

    基于Yolov5和Intel_Realsense_D435i开发的物体之间三维距离测量源码+使用说明.zip 基于Yolov5和Intel_Realsense_D435i开发的物体之间三维距离测量源码+使用说明.zip 基于Yolov5和Intel_Realsense_D435i开发的物体...

    《使用vue全家桶+express+php ci+Mysql实现的电影图书查询APP(使用豆瓣API) 》+项目源码+文档说明

    使用vue全家桶+express+php ci+Mysql实现的电影图书查询APP,使用豆瓣API - 不懂运行,下载完可以私聊问,可远程教学 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目...

    8层板设计飞思卡尔I.MX6x+MAX8903C+WM8962智能家居控制主板CADENCE原理图+PCB.zip

    标题中的“8层板设计飞思卡尔I.MX6x+MAX8903C+WM8962智能家居控制主板CADENCE原理图+PCB”揭示了这个项目的核心技术内容,...这样的设计可以为学习者提供深入了解嵌入式系统、电源管理、音频处理和PCB设计的实际案例。

Global site tag (gtag.js) - Google Analytics