printf小结
下午健身前和lxt兄弟讨论了一个关于 printf 输出的问题,恰巧以前见过类似的,回来写一个收获总结。
首先看一个这样一个例子
#include<cstdio>
int i;
int main()
{
printf("%d %d", i, i ++);
}
Output:
1 0

其实是这样的,printf参数的顺序是一个未定义行为,编译器不同,实现不同,gcc和clang是右到左,msvc是左到右,所以实现这种未定义行为不要引入有变化的参数
就拿我的gcc来解释一下
printf("%d %d", i, i ++);
这句话有两个表达式 i 和 i ++,我们将 i 视为第一个表达式,将 i ++ 视为第二个表达式。
打印标量表达式的顺序是从左到右,但是变量表达式的评估顺序是从右到左,即先去计算位于最右侧的第二个表达式,然后是最左侧表达式。
我们知道 i ++ 是 i 的后增量运算符。
在第一步中(右侧首先赋值再加加),那么 i 的值保持为0(不增加其值),并且在下一步中(左侧表达式),i 的值增加到1。因此,第二个表达式(i ++)值为0并且第一个表达式 i 值递增获得的值为 1。
如前所述,打印值的顺序是从左到右。因此,首先打印第一个表达值,然后打印下一个。因此,输出序列为1 0。

好吧,让计算机汇编语言来数据公道话,
在实际的汇编语言中这段代码深层含义其实是
1.把 i 的值存入缓冲器[..a.] = 0;
2.i 值加1,i 值为1;
3.把1如缓冲器[..b.] = 1;
4,把缓冲器[..a.] = 0,入栈;
5.把缓冲器[..b..]=1,入栈;
栈(后进先出),打印顺序1, 0
好了接下来应该懂了为什么
printf("%d %d\n", i, i++);
会是1,0了
不过还有一个问题
#include<cstdio>
int i;//全局默认是0 int main()
{
printf("%d\n", ++i);
printf("%d\n", i);
i = ;
printf("%d %d\n", ++i, i); }
结果是
1
1
1,0
而如果在局部里声明
结果是
1
1
1,1
猜测是全局和局部的事,不会QAQ~,后续更新
参考博客(文章):https://blog.csdn.net/qq_33266987/article/details/51965221
https://blog.csdn.net/u014644714/article/details/77688321/?tdsourcetag=s_pctim_aiomsg
https://www.quora.com/int-i-0-printf-d-d-i-i++-what-is-the-output-of-this-statement
https://blog.csdn.net/yangquanhui1991/article/details/51786380
感谢上述前辈的博客!
学艺不精,有任何不足或者错误请大神多多指教
工具:
http://tool.chinaz.com/Tools/textencrypt.aspx
加密文字:
U2FsdGVkX1/nj0dlo2LGp8dtHyMkOBjFux9QbhsmqhBtyC5sgxZZOL0MXIIocHZb
hUhU+c3CrJ8m9Zg+o+6vGiVwH8cjFITRkANC97IJZAJWUKSaYIPrOfxXyyXswNAS
uTcq0j/Bi8VwoWr7/UsBxh1QIaL0EdRhonptmqlBn1lDkbQnrrZnu1Efxn7jS+yh
wdjZSgtAme33No3KUAaM1l6z3acRm52/kIPW3BNsgVaHUFUAGFlnzxE4dN2J2Xkr
密钥:
139*****136
printf小结的更多相关文章
- linux printf和fork()问题小结
总结如下: printf("father begin"); pid_t pid; pid = fork(); ) { ) { printf("father out&quo ...
- C语言 指针小结
指针 -->指针变量 类型名 *变量名 int *point1; char *point2; 注意:*p可以直接使用,它代表指针p指向的变量,*p可以当做被指向的变量使用!~~~~ 一个变量的地 ...
- Linux环境下段错误的产生原因及调试方法小结(转)
最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且 项目工程庞大复杂,出现了不少问题,其中遇到最多.花费时间最长的问题就是著名的“段错误”(Segmentation F ...
- Java中文编码小结
Java中文编码小结 1. 只有 字符到字节 或者 字节到字符 的转换才存在编码转码; 2. Java String 采用 UTF-16 编码方式存储所有字符.unicode体系采用唯一的码点表示唯一 ...
- Linux环境下段错误的产生原因及调试方法小结
转载自http://www.cnblogs.com/panfeng412/archive/2011/11/06/2237857.html 最近在Linux环境下做C语言项目,由于是在一个原有项目基础之 ...
- 函数fgets和fputs、fread和fwrite、fscanf和fprintf用法小结 (转)
函数fgets和fputs.fread和fwrite.fscanf和fprintf用法小结 字符串读写函数fgets和fputs 一.读字符串函数fgets函数的功能是从指定的文件中读一个字符串到字符 ...
- objective-c基础教程——学习小结
objective-c基础教程——学习小结 提纲: 简介 与C语言相比要注意的地方 objective-c高级特性 开发工具介绍(cocoa 工具包的功能,框架,源文件组织:XCode使用介绍) ...
- [数据结构]RMQ问题小结
RMQ问题小结 by Wine93 2014.1.14 1.算法简介 RMQ问题可分成以下2种 (1)静态RMQ:ST算法 一旦给定序列确定后就不在更新,只查询区间最大(小)值!这类问题可以用倍增 ...
- [数据结构]KMP小结
KMP小结 By Wine93 2013.9 1.学习链接: http://www.matrix67.com/blog/archives/115 2.个人小结 1.KMP在字符串中匹配中起着巨大作 ...
随机推荐
- 【错误】python百分号冲突not enough arguments for format string
query = "SELECT * FROM devices WHERE devices.`id` LIKE '%{}%'".format("f2333") d ...
- windows下部署.netcore+docker系列四 (部署程序,重点就要来了)
前面的都是为这章做准备,加油把骚年们 PS:C# 项目可以按照流程一步步来,java 偶然其他的可以找下其他的网上资源 1.在 VS2019中 添加docker 支持 (其实也就是追加一个Docker ...
- go获取当前项目下所有依赖包
在设置好GOPATH,GOROOT的环境变量的情况下. 在项目配置好pkg.bin.src等这几个目录的情况,进入src目录. 在终端,输入:go get ./... 即可获得所有依赖包.
- Python网络爬虫:伪装浏览器
一.添加超时跳过功能 首先, 我简单地将 urlop = urllib.request.urlopen(url) 改为 urlop = urllib.request.urlopen(url, time ...
- elementaryos5安装mysql5.7、php7.2、nginx1.14.0
一.mysql5.7 安装mysql5.7: sudo apt-get install mysql-server-5.7 查看安装的mysql版本: mysql -V 5.7版本mysql安装过程中以 ...
- 深入理解PHP之数组(遍历顺序)
作者: Laruence 本文地址: http://www.laruence.com/2009/08/23/1065.html 转载请注明出处 经常会有人问我, PHP的数组, 如果用foreach来 ...
- 2019-2020-1 20199326《Linux内核原理与分析》第二周作业
本周总结:本周的学习内容主要是庖丁解牛Linux的第一章,然后看完书后,又跟着云班课加深学习了一下第一章的内容.第一章主要讲述了linux里的汇编指令的一些指令,比如movl,pushl,popl等等 ...
- Libra教程之:数据结构和存储
文章目录 存储的数据结构 账本历史 账本状态 账户 事件 前面的文章我们知道,libra会把所有的数据都存储在账本中.为了方便业务逻辑和数据的校验,这个存储是以特定的数据结构来实现的,这里我们叫做验证 ...
- CSS样式2
1.css重用 <style> .cl{ ... } .c2{ ... } .c{ ... } </style> <div class='c c2'></di ...
- Knapsack Problem
0-1背包 描述:N件物品,第i件的重量是w[i],价值v[i].有一个容量为W的背包,求将哪些物品放入背包可使总价值最大.每件物品可以用0或1次. 分析:根据题意,可以写出表达式: \[max(\S ...