printf的计算和输出顺序

结论

  1. printf函数的计算是从右向左进行;
  2. 遇到i++,会把此时i的值当作最后的输出值,注意,确定为输出后,i还会自增;
  3. 遇到i++i,仅仅修改当前i的值,最后才输出i

例子

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

输出:

4,5,5,2,
5

分析

从右往左看:printf("%d,%d,%d,%d,\n",i++,++i,i,i++);
首先,i++,第四位的输出定格在2,再运算,i的值是3
其次,i,第三位的输出不能确定,因为前面还有运算,此时i3
然后,++i,先运算,此时i的值是4,但第二位的输出还不能确定。
最后,i++,第一位的输出定格在4,再运算,i的值是5,此时可以确定倒数第二位和第三位的输出都是5。

验证

有人不信“最后”的分析,也就是说不相信printf中的i++i是等所用运算完毕后,由最终的i确定,那么我们在printf的第一位再加个++i。理论上,这个++i是最后执行,i会由5变成6,且6作为从右往左数第2,3,5位的输出。

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

结果是:

6,4,6,6,2,
6

与理论相符。

拓展:C函数参数计算顺序

#include <stdio.h>
void fn(int a,int b,int c)
{
    printf("%d,%d,%d", a, b, c);
}
int main()
{
    int a = 3;
    fn(a++, a++, a++);
    return 0;
}

输出:

5,4,3

分析: C函数参数作为一个整体执行的顺序是从右向左,所以会先处理最右端的参数,然后依次向左处理。所以结果为最右端的a++先被处理结果为3,然后++,接着4和5,这样就有了上面的结果。

究极测试

下面程序的输出是什么?

#include <bits/stdc++.h>
using namespace std;

int fun(int n, int m) {
	int j=1;
	j*=++n+m--;
	return j;
}

int main( ) { 
	int k;
	for(k=0;k<5;k++){
		printf("%d,%d\n", k,fun(k++,k++)+(++k));
		printf("%d\n", k);
	}
	return 0;
}

输出:

3,5
3
7,17
7

分析:记住原则,在函数参数列表中,计算从右往左;在一条语句中,计算从左往右。

printf("%d,%d\n", k,fun(k++,k++)+(++k));printf函数,它有两项参数,从左到右是:kfun(k++,k++)+(++k)。因此计算时是先fun(k++,k++)+(++k)k

fun(k++,k++)+(++k)是一条语句,因此先计算fun(k++,k++)再加上(++k)

  1. 计算fun(k++,k++):第一次进for循环,k=0,按照从右往左的顺序计算,第一个传进去的是0,然后k变为1,第二个传进去的是1,然后k变为2。
  2. 计算(++k):执行完fun(k++,k++),k是2,再看(++k),先加后用,(++k)呈现出来是3,此时k也是3。fun(k++,k++)返回2,再加上(++k)是3,因此fun(k++,k++)+(++k)为5,该位置输出5。
  3. 再看printf中的第一个输出k,经过fun(k++,k++)+(++k)的运算,k此时为3,因此输出3。
  4. 最后看printf("%d\n", k);其实和上面的k一样,也是3。
  • 23
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值