【C语言进阶深度学习记录】十三 C语言中 ++和--操作符
- 学习交流加(可免费帮忙下载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语言中 ++和--操作符相关推荐
- 【C语言进阶深度学习记录】二十一 # 和 ## 号操作符的使用与分析
文章目录 1 # 运算符 1.1 # 运算符的基本用法 1.2 # 运算符的妙用 2 ## 运算符 2.1 ##运算符的基本用法 2.2 ##运算符的工程运用 3 总结 1 # 运算符 #运算符用于在 ...
- 【C语言进阶深度学习记录】三十五 程序中的堆、栈以及静态存储区(数据区)
学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 在我之前学习底层的知识的时候,也写过相关的内容.可以对比的学习:[软 ...
- 【C语言进阶深度学习记录】三十八 C/C++语言中的函数声明与函数定义
文章目录 1 函数的声明和定义 1.1 代码分析 2 总结 1 函数的声明和定义 声明的意义在于告诉编译器程序单元的存在.只是告诉编译器它存在但是不在声明这里定义,有可能在当前文件中的其他地方或者其他 ...
- 【C语言进阶深度学习记录】二十六 C语言中的字符串与字符数组的详细分析
之前有一篇文章是学习了字符和字符串的,可以与之结合学习:[C语言进阶深度学习记录]十二 C语言中的:字符和字符串 文章目录 1 字符串的概念 1.1 字符串与字符数组 1.2 字符数组与字符串代码分析 ...
- 【C语言进阶深度学习记录】十九 #pragma使用与分析
文章目录 1 #pragma 概念简介 1.1 #pragma message 的用法 1.2 #pragma once 的用法 1.3 #pragma pack 的用法 1.31 struct占用的 ...
- 【C语言进阶深度学习记录】十六 静态库与动态库的创建与使用
上一篇文章学习了编译的过程,点击链接查看:[C语言进阶深度学习记录]十五 编译过程简介,每一个C源文件编译后将会生成目标文件,那么这些目标文件,还需要链接起来,生成可执行文件. 文章目录 1 链接的意 ...
- 【C语言进阶深度学习记录】八 C语言中void的分析
文章目录 1 void的意义 1.1 不存在void变量 1.2 C标准 1.3 void指针的意义 1.4 通过void* 实现memset函数 2 总结 1 void的意义 void修饰函数的参数 ...
- 【C语言进阶深度学习记录】五 C语言中变量的属性
上一篇文章学习了C语言中的类型转换,点击链接查看:[C语言进阶深度学习记录]四 C语言中的类型转换. 文章目录 1 C语言的变量属性 1.1 auto关键字 1.2 register关键字 1.3 s ...
- 【C语言进阶深度学习记录】十七 宏定义的使用与分析
文章目录 1 C语言中的宏定义 1.1 定义宏常量 1.2 宏定义表达式 1.3 宏表达式与函数的对比 1.4 宏表达式的作用域 2 C语言中的内置宏 3 宏定义的代码综合示例 4 总结 1 C语言中 ...
- 【C语言进阶深度学习记录】九 C语言中const的详细分析
文章目录 1 const的分析 2 const本质的分析实验 2.1 代码案例分析 3 const修饰函数参数和返回值时的情况 3.1 代码案例分析 4 总结 1 const的分析 不管是C语言还是C ...
最新文章
- 浅析.Net共享程序集编程
- Hello!The familiar and strange world.
- 信息论4—无失真信源编码(非延长码,霍夫曼编码)
- tesseract-ocr的安装及使用
- matlab/ansys协同的一个例子
- 机器学习实战11-训练深层神经网络
- Android调用系统照相机
- Android P版自定义开关机动画
- 源码编译安装keepalived
- MaxCompute/DataWorks权限问题排查建议
- 微型计算机系统中传感器的作用,一文读懂传感器原理、作用及技术特点
- sci的JCR分区和中科院分区
- P2构型并联混合动力汽车Cruise整车仿真模型
- 全国计算机四级数据库工程师考试真题及答案(Word版)
- VSCode 使用 LESS
- Xiao Shenyang's classic lines
- ubuntu 下如何调节显卡风扇转速?
- 用一报还一报(TIT FOR TAT)策略的胜利指导我们的生活和人际交往
- flink类加载器原理与隔离(flink jar包冲突)
- Html 实现手风琴效果