目录

(1)前置加加和后置加加的区别

(2)printf输出前置加加

(3)printf输出后置加加

(4)printf输出printf


(1)前置加加和后置加加的区别

首先我们先来了解一下前置加加和后置加加的区别。

前置加加在编译器里的操作

//++a
int a = 0;
a = a + 1;
return a;

前置加加是先加一,后赋值,返回的值是加一之后的值。

后置加加在编译器里的操作

//a++int a = 0;
tmp = a;
a = a + 1;
return tmp;

后置加加是先把值赋给临时量,然后再加一,返回的值是临时量的值。

前置加加可以做左值,因为前置加加返回的是a的值,是可以进行操作的,后置加加则不可以,因为后置加加返回的是一个临时量,并不是程序中定义的可寻址变量,不能通过地址对temp进行操作。


(2)printf输出前置加加

#include<stdio.h>int main()
{int i = 1;printf("%d,%d\n",++i,++i);return 0;
}

printf函数计算参数的时候是从右往左压栈的。目的是为了计算参数的个数。编译器首先从右往左计算各参数的值,再进行压栈操作,最右端的"++i"的值是计算出来是2,保存在eax寄存器中,接着计算倒数第二个"++i"的值,给eax寄存器加一,保存为3,然后进行压栈,把eax寄存器里的i的地址放入栈中,此时输出的值是i的值,所以都是3.


(3)printf输出后置加加

#include<stdio.h>int main()
{int i = 1;printf("%d,%d\n",i++,i++);return 0;
}

最右端的"i++"的值为1,保存在临时量里,计算出i的值为2,倒数第二个"i++"的值为2,i的值为3,"i++"也保存在对应的临时量里,但是两个临时量保存的地址是不同的,进行压栈操作,压入的是保存两个临时量的地址,所以输出的是2和1.

汇编指令:


(4)printf输出printf

#include<stdio.h>int main()
{int i = 33;printf("%d\n",printf("%d ",printf("%d ",i)));return 0;
}

首先输出的第一个"33"是"i"的值,第二个"%d"算出来的是"33"的值的字节大小,占两个字节,还有空格的字节长度,一共是三个字节,所以输出的是"3",第三个"%d"算出来的是"3"的值的字节大小,占一个字节,还有空格的字节长度,一共是两个字节,所以输出的是2。

printf函数输出多个printf 、前置加加或者后置加加相关推荐

  1. 关于C语言中printf函数“输出歧视”的问题

    目录 关于C语言中printf函数"输出歧视"的问题 问题描述 探索问题原因 另一种研究方法 问题结论 关于C语言中printf函数"输出歧视"的问题 问题描述 ...

  2. c程序设计语言中printf,编程序 用getchar函数读入两个字符c1和c2,然后分别用putchar和printf函数输出这两个字符。请问...

    编程序,用getchar函数读入两个字符给c1和c2,然后分别用putchar和printf函数输出这两个字符.请问: 1. 变量C1,C2应定义为字符型或整型?或二者皆可? 答:在这个题目里,变量C ...

  3. C语言学习之编程序,用getchar函数读入两个字符给cl和c2,然后分别用putchar函数和printf函数输出这两个字符

    编程序,用getchar函数读入两个字符给cl和c2,然后分别用putchar函数和printf函数输出这两个字符.思考以下问题: (1)变量cl和c2应定义为字符型,整型还是二者皆可? (2)要求输 ...

  4. 使用printf函数输出

    多行文本输出 整段输出 多行文本输出 在上节的教程中,我们使用printf()函数输出了Hello, World! 以向这个世界问好.你可能留意到了文中提到的\n,它用于产生一个新行,这样再次输出文本 ...

  5. c语言之printf函数输出字符数据

    //用printf函数输出字符数据 #include <stdio.h> int main() {//定义两个变量char c = 'a';int i = 97;//输出变量%c以字符形式 ...

  6. C++之前置自增与后置自增

    关于前置自增与后置自增的区别我是参考这里:http://bbs.bccn.net/thread-454977-1-1.html 简单复述下,比如++x; 与 x++; 在C中,++x这个表达式的值为原 ...

  7. 单元测试|Unittest setup前置初始化和teardown后置操作

    Unittest setup前置初始化和teardown后置操作 针对类中每个函数执行时进行前置后置的操作 setUp(self):测试前的初始化操作 tearDown(self):测试后的操作 代码 ...

  8. 【程序设计】前置检测循环和后置检测循环

    前置检测循环的结构: while () {// ... } 后置检测循环的结构: do {// ... } while () 前置检测循环和后置检测循环的区别: 从定义上看,前置检测循环在程序开头有测 ...

  9. 什么是前置审批许可、后置审批许可?

    注册公司办理营业执照时要填写公司经营范围,公司经营范围通常分为"一般经营项目"和"许可经营项目".一般经营项目是企业不需要提供特种行业经营许可的经营项目:许可经 ...

最新文章

  1. 操作系统安全加固原理
  2. android+3e错误,Android 错误
  3. ibmmq 通道命令_IBM MQ 从接收通道获取数据
  4. python正确的赋值语句-Python 赋值语句技巧之序列解包
  5. 设计模式-观察者模式 实现
  6. 数据库行转列的sql语句(zt)
  7. leetcode306. 累加数(回溯)
  8. Java基础学习总结(121)——Java JVM执行流程
  9. VMware 未能初始化监视器
  10. mupdf添加图片水印_在博客园里给图片加水印(canvas + drag)
  11. 实战篇---Nios ii 基本操作
  12. HOUR 11 Developing Advanced Pointers
  13. Autonomous Driving in Adverse Weather Conditions: A Survey - 恶劣天气条件下的自动驾驶:一项调查 (arXiv 2021)
  14. 一加11:新的赛场,“不温和”的答卷
  15. 【开发技能】研发线上事故总结!
  16. 用java代码输出乘法口诀表
  17. 高级电工实验室装置QY-DG758A
  18. java影射射射...
  19. 1024 - 在这里起航!
  20. 什么是sqfs文件格式

热门文章

  1. 解密 云HBase时序引擎OpenTSDB 优化技术
  2. 【公测中】阿里云发布国内首个大数据双活容灾服务,满足高要求大数据灾备场景
  3. 用深度学习解决Bongard问题
  4. 追踪 Kubernetes 中的网络流量
  5. 程序员!别逼自己买课了,每天花10分钟做这件事,写代码能力暴增......
  6. 刷爆了!李彦宏:这类程序员我给100万!你怎么看?
  7. Spark精华问答:DataFrame与RDD的主要区别在哪?
  8. 细说说傲腾与哈娜的那些事儿
  9. python document_python处理document文档保留原样式
  10. php同时删除两个列表数据库,PHP 处理 数据库多表,既能高效又能思路清晰如何处理的?...