关于printf(“%d,%d“,i--,i++)的问题
i++是先进行运算在加一,++i是先加一再进行运算
i--是先进行运算在减一,--i是先减一再进行运算
为什么一模一样的程序反而运行的结果却又如此大的差异????
此时我们从简单开始进行分析
正常我们的运算是,9,10,11,12
由上图我们可以看出,和正常的算法是不同的
而该图我们可以得知编译器是从右往左进行运行的
若按正常的计算来说,12,10,10,9,根据上图,我们不难看出,++i的值是一致的,且一最后一个为准,所以说为12,10,12,12
同理
该图正常算法,输出结果应该为,11,11,10,9,但是i++是先参与运算在加一,所以其储存的i=12,所以结果又变为了11,12,12,12.
此时我们根据上图可以发现,i++的值是不变的
由此我们会发现,++i,以最后的i的值为结果,而 i++是以正常的,本来的结果为准。
这时我们继续研究i--,--i
我们惊奇的发现,--i竟然也不是正常算法,且与++i极其相似,结果一致性
而i--呢,是正常算法,且编译器从右往左
于是我进行了如下操作
正常计算的话,先进行i--,结果为8,然后--i,结果为6,接着i--,结果仍为6,i--结果为5,但是此时储存i的值是4,因为i--是先进行运算再减一,也就是先输出原来的值,i的值再减一
同理这几个程序,我们发现--i是以最终的i的结果为答案,而--i是以正常运算的结果为准,那么当我们将集中表示混合起来时,规律是否成立
Int i=8; 编译器输出 正常算
- printf(“%d,%d,%d,%d/n”,++i,++i,--i,--i) 8,8,8,8 8,7,6,7
- printf(“%d,%d,%d,%d/n”,++i,--i,--i,--i) 6,6,6,6 6,5,6,7
- printf(“%d,%d,%d,%d/n”,i++,i++,i--,i--) 7,6,7,8 7,6,7,8
- printf(“%d,%d,%d,%d/n”,i++,i--,i--,i++) 7,8,9,8 7,8,9,8
- printf(“%d,%d,%d,%d/n”,i++,i--,++i,i--) 7,8,8,8 7,7,8,8
- printf(“%d,%d,%d,%d/n”,++i,i--,i++,--i) 8,8,7,8 8,8,7,7
由此我们总结出结论
符号在前面的,一律为最终的i, 符号在后面的,一律正常计算
由此我们就可以解释这个问题了
首先我们进行从右往左进行运算,得到的结果为
输出 i
-i--=-(i--) -8 7
-i++=-(i++) -7 8
i-- 8 7
i++ 7 8
--i 7 7
++i 8 8 i=8
对于这种计算,我总结了一个规律,
符号在后直接输出,i的值要变的,符号在前,i经过加减后再输出
8,7,7,8,-7,-8
按照规律即为8,8,7,8,-7,-8
你学会了吗?
关于printf(“%d,%d“,i--,i++)的问题相关推荐
- 关于C语言中printf函数“输出歧视”的问题
目录 关于C语言中printf函数"输出歧视"的问题 问题描述 探索问题原因 另一种研究方法 问题结论 关于C语言中printf函数"输出歧视"的问题 问题描述 ...
- Go 学习笔记(46)— Go 标准库之 fmt(输入/输出格式化参数、Printf/Fprintf/Sprintf区别、Println/Fprintln/Sprintln 区别)
1. 概述 import "fmt" fmt 包实现了类似 C 语言 printf 和 scanf 的格式化 I/O .格式化动作( verb )源自 C 语言但更简单. 2. P ...
- c语言字符串 s,c – printf格式字符串中“% – *.* s”的含义是什么
你可以在这里阅读printf的手册页: http://pubs.opengroup.org/onlinepubs/009695399/functions/fprintf.html.但是它更像是法律文本 ...
- printf格式化输出几点注记
搞了很多年c/c++,有很多细小的东西,曾经不止一次遇到,可是一直都是放在零散的地方,要用的时候怎么也找不到,今天,我痛下决心,改掉不良习惯,把这些经验或是tips记录在这里,便于日后查找. 1.在统 ...
- PHP函数printf()、sprintf()的用法
printf()函数优点在于可以格式化输出 格式: %['padding_character][-][width][.precision]type 所有的转换说明都是以%开始,如果想打印一个%符号,必 ...
- printf(%d, -10u); 这个输出什么呀, 0或1?
printf("%d", -1<0u); 这个输出什么呀, 0或1? 周银辉 既然我这么问了, 那么答案自然不是1,而是0 看看下面的代码: 对于-1+0u输出为-1,似乎理 ...
- fprintf、printf、sprintf、fscanf、scanf、sscanf 格式化输入输出
格式化输入输出 1. fprintf(格式化输出数据至文件) 相关函数 printf,fscanf,vfprintf 表头文件 #include<stdio.h> 定义 ...
- 【C】printf warning: unknown conversion type character ‘l‘ in format [-Wformat=]
1.问题描述 在使用printf.fprintf打印long long类型时报错 printf warning: unknown conversion type character 'l' in fo ...
- 【linux】printf在终端打印彩色hello world
代码 #include <stdio.h>#define NONE "\033[m" #define RED "\033[0;32;31m" #de ...
- c语言自定义char*函数返回值是乱码_[每日C语言」printf()函数的修饰符和返回值...
在上一个小demo<printf()函数(1)>中主要说了一下printf()函数的转换说明符,这些转移说明符是可以被修饰的.我们可以在%d和定义的转义字符之间通过插入修饰符对基本的转换说 ...
最新文章
- 频频转型的蘑菇街,能讲好直播这个“老故事”吗?
- spring源码构建以及模块划分和依赖
- 探索Julia(part10)--自定义函数
- 多生产者_你是生产者还是消费者?这决定了你的层次。
- 鹦鹉助手模拟器 梦幻西游 找不到服务器,模拟器玩梦幻 17173鹦鹉助手模拟器上线...
- JSON跨域解决方案收集
- Centos 下Nginx 自启动脚本
- 深度学习TF—13.对抗生成网络—GAN
- Android虚拟键盘上下左右键按下和弹起的响应事件
- android服务之service(其二)关于aidl进程间通信,Android初级教程进程间的通信AIDL
- 简化Simulink的建模与模型重构
- 在线java编译器_五个免费在线Java编译器,轻松编译代码
- 系统集成项目管理工程师必考公式
- 用u盘安装mysql,奥维互动地图企业服务器基本环境安装 ——U盘引导安装CentOS 6.5...
- Ueditor编辑器如何改变上传图片大小限制
- MAC-重新安装系统的三种方法
- 震惊!AI居然轻松消除马赛克-文字增强,GitHub开源项目上线三天收获近7000星
- DAP数据分析平台可视化组件开发
- 网关(Gateway)
- 使用BAT脚本批量修改文件名的方法