printf函数计算顺序究竟是什么?

  老师在课上简单的略过,自己算的时候会发现这一块很懵。

  我自己尝试了几个代码,得出我自己的一套理论。

  那么c语言中printf函数计算,究竟该怎么算?

提前声明:在不同环境中的计算结果会有差别,本次分享的是在cfree的编译环境下的运算。

printf函数的输出列表,从右到左执行,从左到右输出

我们来看一个例子:

#include <stdio.h>
int main()
{ int a;
  printf("&d,&d,%d",a=13,a=20,a=40);
  return 0;
}
   

 输出结果为13,20,14

由此可见所谓的从右到左执行,并不是传统意义上的从右到左计算。

如果是从右到左计算,如下:

int main()
{ int a;
  a=40;
  a=20;
  a=13;
  printf("%d",a);
  return 0;
}

a之前的赋值都会被覆盖,以最终赋值为结算。最终输出结果为13。

所以按照传统运算的逻辑,第一个代码因该输出13,13,13      而结果并不是。

ok,这是我们得到的第一个线索

接下来我们看第二个代码

void main()
{
	int a;
	a=1;
	printf("%d,%d,%d",a=a+2,a=a++,a=a++);
}

明白这个,就能进一步明白“非传统运算”的概念。我先说答案: 3,1,1

就像我之前说的,是不会覆盖的。

也就是说,从右到左计算。先给a赋值,后增,所以a=1。 讲道理,赋值完以后,a会自增,所以a=2,再继续往下运算。

而实际上并不会。

其中的逻辑是,当第一步赋值完结束,a=1这个结果一方面会被塞入第三个%d,同时a=1会被放到第二个赋值中。

第二个也一样,赋值完以后就被塞入第二个占位符,同时到第一个赋值中

第一个赋值先计算,a=1+2=3,再赋值。输出3,放入第一个占位符。完毕

由上面两点线索,我们可以发现,在printf运算中,以赋值完毕为标志,填入对应占位符,在放入下个赋值,重复。

再举一个例子

void main()
{
	int a;
	a=1;
printf("%d %d %d\n", a=a+3, a++,a++);
}

输出6,2,1

我们可以发现其中没有赋值之说,此时运算会延续,因为没有赋值为标志结束。

首先第三个中,先用a=1填入占位符,再自增。此时a是以=2进入下一步的

第二个中,先用a=2填入占位符,再自增。此时a是以=3进入下一步

第一个中,则为a=3+3=6

我们再来一个例子验证一下:

void main()
{
	int a;
	a=1;
printf("%d %d %d\n", a=a+3, a++,a=a++);

第三个中a有赋值,所以a=1填入占位符,后增在这里没有意义

第二个中,先用a的值,此处就是a=1,填入占位符。然后后增,此处后增有意义,a=2

第三个中,就是计算2+3=5

所以输出5,1,1

再来几个例子巩固

void main()
{
	int a;
    printf("%d %d %d\n", a++, a++, a = 5);
}

输出6,5,5

#include <stdio.h>
void main()
{
	int a=1;
    printf("%d %d %d\n", a = 3, 3 * (a - 4), 2 * (a++));
}

输出3,-2,6

#include <stdio.h>
void main()
{
	int a=1,b=3;
    printf("%d %d %d\n", a + b--, a = b * (a += 5), b + 2 * (a = 2));

输出       24,21,7

结束

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值