• 学习交流加(可免费帮忙下载CSDN资源):
  • 个人微信: liu1126137994
  • 学习交流资源分享qq群1(已满): 962535112
  • 学习交流资源分享qq群2: 780902027

文章目录

  • 1 ++和--操作符的本质
  • 2 总结

1 ++和–操作符的本质

  • ++ 和 - - 操作符对应两条汇编指令

    • 前置:

      • 变量自增(减)1
      • 取变量值
    • 后置

      • 取变量值
      • 变量字增(减)1

上述只是定义了 ++ 和 - - 操作符本身的取值与自增加减顺序。但是如果多个 ++ 或者 - - 操作符放在一起进行运算呢?像下面这样?

  • 你觉得上述两个表达式的值分别是多少?或许你心中已经有答案,但是我们不妨先写代码验证一下:

  • 代码 17-1.c

#include <stdio.h> int main()
{int i = 0;int r = 0;r = (i++) + (i++) + (i++);printf("i = %d\n", i);printf("r = %d\n", r);r = (++i) + (++i) + (++i);printf("i = %d\n", i);printf("r = %d\n", r);return 0;
}
  • 编译运行结果为:

i = 3
r = 0
i = 6
r = 16

  • 这个答案呢,与我们所想的稍微有所差别。最后一次r ,我们预想的应该是15 ,或者有的人认为应该是18 。但是最终结果却是16.这是为什么呢?

  • 因为在 ++ 和 - - 的混合运算中,它们并不是原子操作。它们所对应的两条汇编指令,有可能不是连续执行,导致最终结果有误。

  • 比如上述代码中,13行的计算中,(++i)+(++i)+(++i)中,有可能是第一个i先++,然后第一个i取值为4,然后第二个i再++不取值,第三个i再++不取值,然后第二个括号取值此时i=6,然后第三个括号取值i=6 。 那么整个表达式就是4+6+6=16 。当然,这只是一种情况,还有很多种情况,不同的情况,最终结果都有可能不一样。

  • 只是本次使用我的编译器,是这样的情况而已。使用其他编译器或许结果就是不一样的。

最终得出一个结论,就是 ++ 和 - -混合运算的计算结果是不确定的。

2 总结

  • ++ 和 - - 在混合运算中,行为可能不同

学习交流加

  • 个人qq:
    1126137994
  • 个人微信:
    liu1126137994
  • 学习交流资源分享qq群:
    962535112

【C语言进阶深度学习记录】十三 C语言中 ++和--操作符相关推荐

  1. 【C语言进阶深度学习记录】二十一 # 和 ## 号操作符的使用与分析

    文章目录 1 # 运算符 1.1 # 运算符的基本用法 1.2 # 运算符的妙用 2 ## 运算符 2.1 ##运算符的基本用法 2.2 ##运算符的工程运用 3 总结 1 # 运算符 #运算符用于在 ...

  2. 【C语言进阶深度学习记录】三十五 程序中的堆、栈以及静态存储区(数据区)

    学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 在我之前学习底层的知识的时候,也写过相关的内容.可以对比的学习:[软 ...

  3. 【C语言进阶深度学习记录】三十八 C/C++语言中的函数声明与函数定义

    文章目录 1 函数的声明和定义 1.1 代码分析 2 总结 1 函数的声明和定义 声明的意义在于告诉编译器程序单元的存在.只是告诉编译器它存在但是不在声明这里定义,有可能在当前文件中的其他地方或者其他 ...

  4. 【C语言进阶深度学习记录】二十六 C语言中的字符串与字符数组的详细分析

    之前有一篇文章是学习了字符和字符串的,可以与之结合学习:[C语言进阶深度学习记录]十二 C语言中的:字符和字符串 文章目录 1 字符串的概念 1.1 字符串与字符数组 1.2 字符数组与字符串代码分析 ...

  5. 【C语言进阶深度学习记录】十九 #pragma使用与分析

    文章目录 1 #pragma 概念简介 1.1 #pragma message 的用法 1.2 #pragma once 的用法 1.3 #pragma pack 的用法 1.31 struct占用的 ...

  6. 【C语言进阶深度学习记录】十六 静态库与动态库的创建与使用

    上一篇文章学习了编译的过程,点击链接查看:[C语言进阶深度学习记录]十五 编译过程简介,每一个C源文件编译后将会生成目标文件,那么这些目标文件,还需要链接起来,生成可执行文件. 文章目录 1 链接的意 ...

  7. 【C语言进阶深度学习记录】八 C语言中void的分析

    文章目录 1 void的意义 1.1 不存在void变量 1.2 C标准 1.3 void指针的意义 1.4 通过void* 实现memset函数 2 总结 1 void的意义 void修饰函数的参数 ...

  8. 【C语言进阶深度学习记录】五 C语言中变量的属性

    上一篇文章学习了C语言中的类型转换,点击链接查看:[C语言进阶深度学习记录]四 C语言中的类型转换. 文章目录 1 C语言的变量属性 1.1 auto关键字 1.2 register关键字 1.3 s ...

  9. 【C语言进阶深度学习记录】十七 宏定义的使用与分析

    文章目录 1 C语言中的宏定义 1.1 定义宏常量 1.2 宏定义表达式 1.3 宏表达式与函数的对比 1.4 宏表达式的作用域 2 C语言中的内置宏 3 宏定义的代码综合示例 4 总结 1 C语言中 ...

  10. 【C语言进阶深度学习记录】九 C语言中const的详细分析

    文章目录 1 const的分析 2 const本质的分析实验 2.1 代码案例分析 3 const修饰函数参数和返回值时的情况 3.1 代码案例分析 4 总结 1 const的分析 不管是C语言还是C ...

最新文章

  1. 浅析.Net共享程序集编程
  2. Hello!The familiar and strange world.
  3. 信息论4—无失真信源编码(非延长码,霍夫曼编码)
  4. tesseract-ocr的安装及使用
  5. matlab/ansys协同的一个例子
  6. 机器学习实战11-训练深层神经网络
  7. Android调用系统照相机
  8. Android P版自定义开关机动画
  9. 源码编译安装keepalived
  10. MaxCompute/DataWorks权限问题排查建议
  11. 微型计算机系统中传感器的作用,一文读懂传感器原理、作用及技术特点
  12. sci的JCR分区和中科院分区
  13. P2构型并联混合动力汽车Cruise整车仿真模型
  14. 全国计算机四级数据库工程师考试真题及答案(Word版)
  15. VSCode 使用 LESS
  16. Xiao Shenyang's classic lines
  17. ubuntu 下如何调节显卡风扇转速?
  18. 用一报还一报(TIT FOR TAT)策略的胜利指导我们的生活和人际交往
  19. flink类加载器原理与隔离(flink jar包冲突)
  20. Html 实现手风琴效果

热门文章

  1. shiro学习(1):shiro简介
  2. spring学习(38):注入set类型
  3. 第二十二期:动画讲解TCP,再不懂请来打我
  4. java学习(131):hashtable
  5. java学习(15):巩固练习
  6. 条件变量 ---C++17 多线程
  7. 中国石油大计算机在线考试中心,中国石油大在线考试.doc
  8. mysql 静态表 是不是 myisam_mysql的静态表和动态表的区别,MyISAM和InnoDB的区别
  9. (转)深入理解Java中的final关键字
  10. 转:在csv中维护变量参数