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. 怎样快速对二进制和十进制进行互转化——IP地址规划与设计总结

    转至:https://blog.csdn.net/erlian1992/article/details/47342189 最近一直在看全国计算机三级网络技术这本书,看到第二章的时候,不免会遇到计算机中 ...

  2. Linux修改权限命令chmod用法示例

    Linux公社 2020年10月13日 来自:Linux迷 网址:https://www.linuxmi.com/linux-chmod.html Linux中的Chmod命令用于更改或分配文件和目录 ...

  3. linux 解决磁盘占用100%

    df -h 查看磁盘使用情况 ll -h 查看文件的大小   使用如下命令查找大于100M的大文件,发现有几个日志文件及临时文件比较大,使用rm –rf删除即可.   find / -size +10 ...

  4. JZ-052-正则表达式匹配

    正则表达式匹配 题目描述 请实现一个函数用来匹配包括'.'和''的正则表达式.模式中的字符'.'表示任意一个字符,而''表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符 ...

  5. laravel7 手机号验证码登陆

    1"设置路由: //展示手机登录页面 Route::get('admin','admin\AdminController@admin'); 2:html页面 <!DOCTYPE HTM ...

  6. jq全选、全不选、反选、单删、批量删除

    <!DOCTYPE html><html> <head> <meta charset="utf-8" /> <title> ...

  7. linux 系统 解决php -v查看到版本于phpinfo()打印的版本不一致问题

    发现问题的原因: 安装zip扩展后,配置成功,但是使用gitlab合并的时候发生错误,经检查,使用phpinfo打印出来的php版本为7.1,而使用linux度服务器 运行 php -v的版本却是5. ...

  8. sql面试 case /union all

    1.sum(case when results='胜' then 1 else 0 end) as '胜' 要求查询出结果: sql语句实现: select date, sum(case when r ...

  9. centos5 源失效解决办法

    将源文件备份 [base] name=CentOS-$releasever - Base failovermethod=priority baseurl=http://vault.centos.org ...

  10. 字节跳动流式数据集成基于Flink Checkpoint两阶段提交的实践和优化

    背景 字节跳动开发套件数据集成团队(DTS ,Data Transmission Service)在字节跳动内基于 Flink 实现了流批一体的数据集成服务.其中一个典型场景是 Kafka/ByteM ...