趣谈 i++ ++i i-- --i

2023-12-04 06:08
文章标签 趣谈

本文主要是介绍趣谈 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 中测试*/

#include <stdio.h>

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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/452417

相关文章

趣谈递归算法

记得之前小罗师傅给我写过一个有趣的VBS程序,代码就不说了,它讲的是一个有趣的小故事:“山上有座庙,庙里有个老和尚很爱跟人家讲故事,故事是这样的:山上有座庙,庙里有个老和尚很爱跟人家讲故事,故事是这样的...”你一定凌乱了:这老和尚是什么鬼!!总是一直重复自己说的话呢??? [自拍也是递归哟] 一、什么是递归调用   哈哈,一个小玩笑,引出递归的定义,程序调用自身的编程

趣谈(思考)TCP建接时三次握手和断连时四次握手

了解TCP的你们应该知道,TCP 协议是基于连接的(UDP不是面向连接的),先建立好连接,然后再进行传输。建立连接时是3次握手,断开连接是四次握手,一起学习: 三次握手建连-客户端发起:        Server 端先监听端口,此时Server的连接状态是 LISTEN 状态。        这时 Client 端准备建立连接,向Server端发送一个 SYN 同步包,Clie

趣谈 Rust 的 Copy trait 和 Clone trait

一、Copy trait 的关键作用 Rust 程序中的变量可以分成两类:实现 Copy trait 的和没实现 Copy trait 的。这有啥区别?当然很重要! 实现 Copy trait 的变量: 不存在所有权问题,可以随意赋值给其他变量,可以随意当参数传递给函数。因为每次赋值或函数传参数,实现 Copy trait 的变量都是把自己的一个完整的拷贝给了别人,而自身不因此受任何牵连和副作

趣谈Linux操作系统:Linux 启动过程

Linux 启动过程 实模式时内存分配 从实模式切换到保护模式 启用分段,就是在内存里面建立段描述符表,将寄存器里面的段寄存器变成段选择子,指向某个段描述符,这样就能实现不同进程的切换了。启动分页。能够管理的内存变大了,就需要将内存分成相等大小的块。 lzma_decompress.img 负责切换模式的原因 解压 kernel.img 太大了,1m 的内存空间不够用,需要先切换

趣谈事件与委托

事件与委托似乎很难以理解,这是因为它们的使用方式与常用的编码有很大的差别,例如通常编写的都是同步代码,调用一个类型的方法,会即刻出现方法执行的结果,这是符合逻辑的。但在某些情况中,同步代码未必满足需求,拿公共汽车来打个比方,如果交通管制中心希望每一辆公车到达一个站点时都发送给自己一个信号以便自己能够随时掌握交通状况,使用同步代码,公汽对象肯定需要调用管制中心对象,这样就出现了我们一直不愿意看到的情

Swift 结构化并发之全局 Actor 趣谈

概览 在 Swift 结构化并发构成的体系中,一个称为“演员”(Actor)的成员扮演了非常重要的角色,它被用来隔离和同步执行中的数据。 除了普通 Actor 以外,还有一个全局“演员”(Global Actor)的概念,它是做什么的?又有什么与众不同的长处呢? 在本篇博文中,您将学到如下内容: 概览1. MainActor:“我是主角!”2. 何为全局 Actor?3. “开始

【Docker】一文趣谈Docker

🏡浩泽学编程:个人主页  🔥 推荐专栏:《深入浅出SpringBoot》《java对AI的调用开发》              《RabbitMQ》《Spring》《SpringMVC》《项目实战》 🛸学无止境,不骄不躁,知行合一 文章目录 前言一、Docker是什么Docker历史 二、Docker为什么会出现三、Docker能做什么总结

Swift 入门学习:集合(Collection)类型趣谈-下

概览 集合的概念在任何编程语言中都占有重要的位置,正所谓:“古来聚散地,宿昔长荆棘;游人聚散中,一片湖光里”。把那一片片、一瓣瓣、一粒粒“可耐”的小精灵全部收拢、吸纳的井然有序、条条有理,怎能不让我们满心欢喜呢? 在 Swift 入门学习:集合(Collection)类型趣谈-上 这篇博文中,我们已初步学习了集合的相关知识。而在下篇中,我们将继续集合的探索之旅。 在本篇博文中,您

Swift 入门学习:集合(Collection)类型趣谈-上

概览 集合的概念在任何编程语言中都占有重要的位置,正所谓:“古来聚散地,宿昔长荆棘;游人聚散中,一片湖光里”。把那一片片、一瓣瓣、一粒粒“可耐”的小精灵全部收拢、吸纳的井然有序、条条有理,怎能不让我们满心欢喜呢? 在这里,我们就和 Swift 语言刚入门的小伙伴们一起来闲聊一番关于集合有趣的内容吧。 在本篇博文中,您将学到如下内容: 概览1. 数据总动员:集合!2. 数组3. 字

ruby、Python 以及 Swift 语言关于 “Finally” 实现的趣谈

0. 概览 结构化代码语义是任何语言入门之必备基本功,想写出“意大利面条”似的美味代码么?直接干就对了! 虽然上面有些“话糙理不糙”,但不可否认的是现今几乎所有高级语言都对代码结构化语义提供了良好的支持。入门码农们的第一课都是先从顺序执行、跳转、条件走偏开始学起。 在顺序执行的结构化代码中,如果之前申请了资源,怎么确保随后无论发生什么事它们都可以被正确释放呢? 在本篇博文中,您将了