printf()中a++与++a的输出问题

在C语言中有个很常用的函数printf(),使用时从右向左压栈,也就是说在printf("%d %d %d %d\n",a,a++,++a,++a)中,依次从右向左开始计算,计算完后才会往%d中输出,因为有多条赋值语句,所以他是个累加过程,直到压栈结束后输出最终得累加值

下面是几组测试样例:

int a;
a=1; printf("%d %d %d %d\n",a,a++,++a,++a); //4 3 4 4
a=1; printf("%d %d %d %d\n",++a,a++,++a,a); //4 2 4 4
a=1; printf("%d %d %d %d\n",++a,a,a++,++a); //4 4 2 4
a=1; printf("%d %d %d %d\n",a++,a++,++a,a++); //4 3 5 1

在这里面有一个a++,和++a两种赋值的语句,它们在printf()中输出时需要注意一下

a++我们都知道是先使用后加一的,那么在printf("%d %d %d %d\n",a,a++,++a,++a);这里也是一样的,从右向左依次计算值,我们先假设把累加数值暂存在t中,则从右向左依次为

int a=1;

 ++a     a自增1               t=2
++a a自增1 t=3
a++ 先使用(输出3)再自增1 t=4
a 不改变 t=4

所有的a++与a的值都按最终的t输出,所以输出为4 3 4 4

只要遇到a++这种先使用在变化的量优先输出。

再比如a=10; printf("%d %d %d %d\n",a,a++,++a,++a);代码



因此输出结果为13 12 13 13

以上就是我总结的判断在printf()中a++与++a的输出问题。

最后再补上一组测试用例:

int a;
a=10; printf("%d %d %d %d\n",a--,a++,++a,--a);
a=10; printf("%d %d %d %d\n",++a,a++,a,a--);
a=10; printf("%d %d %d %d\n",a++,a--,a++,++a);
a=10; printf("%d %d %d %d\n",a++,a,++a,a++);

输出结果分别为

//11 10 10 10
//11 9 11 10
//11 12 11 12
//12 13 13 10

最后说明一下因为目前博主只是小菜鸟一枚,很多东西都不懂,只是随便写写,希望我写的这篇文章对你能有帮助。

printf()函数压栈a++与++a的输出的更多相关文章

  1. printf函数压栈解惑

    最近看到一些程序员的笔试题目,经常会考到printf函数的参数压栈问题,总体来讲就是参数从右向左依次压栈,再出栈,但是今天看到一个看似很简单的题目,却一直找不到头绪.题目如下: #include &l ...

  2. printf函数压栈(i++/i--,++i/--i) 终极解密

    #include <stdio.h> void main() { ; printf("%d %d %d %d\n", i, --i, i, i--); } 输出是“3 ...

  3. arm汇编进入C函数分析,C函数压栈,出栈,传参,返回值

    环境及代码介绍 环境和源码 由于有时候要透彻的理解C里面的一些细节问题,所有有必要看看汇编,首先这一切的开始就是从汇编代码进入C的main函数过程.这里不使用编译器自动生成的这部分汇编代码,因为编译器 ...

  4. 汇编中call printf参数压栈时错误理解

    EAX, ECX,EDX,EBX均可以32bit,16bit,8bit访问,如下所示: <-------------------EAX------------------------>|& ...

  5. C/C++ 函数压栈方式

    一,不同关键字,系统压栈方式 1,如果函数func是__cdecl(VC下的默认调用方式),调用时情况如下 int   main()   {   //参数从右到左压栈   push   4   pus ...

  6. C语言函数参数压栈顺序为何是从右到左?(从左向右的话,碰到printf的会陷入死循环)

    上学期学习了汇编语言,并在操作系统实验中使用了汇编+C语言混合编程,中间也了解了一些C语言与汇编语言的对应关系. 由于汇编语言是底层的编程语言,各种函数参数都要直接控制栈进行存取,在混合编程中,要用汇 ...

  7. c/c++的函数参数压栈顺序

    整理日:2015年3月18日 为了这句话丢了很多次人.无所谓了,反正咱脸皮厚. 总结一下 编译出来的c/c++程序的参数压栈顺序只和编译器相关! 下面列举了一些常见的编译器的调用约定 VC6 调用约定 ...

  8. C语言函数入参压栈顺序为什么是从右向左?

    看到有人提问到,在处理printf/cout时,压栈顺序是什么样的?大家都知道是从右往左,也就是说从右往左的计算,但是,这里的计算不等于输出. a++和++a的压栈的区别:在计算时,遇到a++会记录此 ...

  9. printf计算参数是从右到左压栈的(a++和++a的压栈的区别)

    一.问题 c++代码: #include <iostream> #include <stdio.h> using namespace std; int main(){ ; co ...

随机推荐

  1. 如何修改oracle数据库用户密码过期策略

    转至:https://www.cnblogs.com/zhangshuaihui/p/11451590.html 1.   查询数据库用户何时过期 登陆数据库PL/SQL工具,输入以下sql语句: s ...

  2. 《Symfony 5全面开发》教程02、安装运行环境并初始化Symfony项目

    Symfony是PHP框架,在学习Symfony之前,我们需要安装PHP运行环境.如果你是MacOS系统,可以使用Homebrew来安装PHP运行环境. Homebrew官网 https://brew ...

  3. IDEA 配置安卓(Android)开发环境

    今天用idea配了一下环境,安装了SDK和Gradle.找了一些学习的资源,明天正式开始学习,配置环境的(3条消息) 用IntelliJ IDEA 配置安卓(Android)开发环境(一条龙服务,新手 ...

  4. Qt:QDateTimeEdit

    0.说明 QDateTimeEdit类提供了一个用于编辑Date和Time的Widget,它就像下边这样 QDateTimeEdit允许用户使用键盘编辑Date.或者用方向键来增加或减少Date.Ti ...

  5. MySql日常解决错误

    MySql数据库导入sql错误 Unknown collation: 'utf8mb4_0900_ai_ci 导入语句:mysql -u root -p database < E:/SS/Tes ...

  6. sprintf的用法总结

    大概知道sprintf的用法,今天在CSDN上看到一篇关于sprintf比较好的总结,现在抄下来,emmmmmmm....... srpintf()函数的功能非常强大:效率比一些字符串操作函数要高:而 ...

  7. Chapter03 Java变量

    Chapter03 变量 目录 Chapter03 变量 3.1 为什么需要变量 3.1.1 一个程序就是一个世界 3.1.2 变量是程序的基本组成单位 3.1.3 简单原理图 3.2 变(变化)量( ...

  8. XML序列化与反序列化接口对接实战,看这篇就够了

    关键字:c# .NET XML 序列化 反序列化 本文为接口对接实践经验分享,不对具体的XML概念定义进行阐述:涉及工具类及处理方法已在生产环境使用多年,可放心使用.当然如果你发现问题,或有不同想法, ...

  9. tep完整教程帮你突破pytest

    持续维护的教程 tep教程会随着版本更新或经验积累,持续维护在电子书中,最新的最全的内容请锁定这篇文章[最新]tep完整教程帮你突破pytest: https://dongfanger.gitee.i ...

  10. MATLAB菜鸟入门笔记【作图章】

    1.函数标签[legend]         http://blog.csdn.net/wangcj625/article/details/6287735/