关于c语言中自增自减运算符的一点思考

本文探讨了C语言中自增运算符的行为及其与printf函数交互的机制。通过两个示例程序展示了在VC++6.0编译器下,自增运算符与printf函数参数处理顺序之间的关系,解释了意想不到的输出结果的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

昨天在群里面聊天,一同学问的问题:

以下程序:

#include<stdio.h>

int main()

{

     int i=0, j=0;

     printf("%d ,%d ,%d\n ",i,i++,i++);

     printf("%d ,%d ,%d \n",j,++j,++j); 

      //

      return 0;

}

可能很多人能很快的得出答案,这不挺简单的题目吗?

然而自己一运行(假设编译器为vc++ 6.0),运行结果应该是:0 0 0

                                                                                                          2 2 1

怎么回事?

其实这就需要追究两点:1.自增自减运算符 2.printf()机制  

首先,在VC++编译器中,printf(“ %d%d”,a,b)是从右向左处理函数的参数。 即先将b压入栈中,再将a压入栈中。 最后,从栈中依次读取a,b.

其次,自增自减运算符,先增运算符是在语句执行前操作,而后增运算符如a++是在语句执行后操作。

所以,语句 printf("%d ,%d ,%d\n ",i,i++,i++);在执行时,按printf栈机制和处理参数顺序理解。执行输出后,进行i++操作两次。

     语句printf("%d ,%d ,%d \n",j,++j,++j); 先将第2个++j压入栈(此时j=1),再将第1个++j压入栈(此时j=2),再将第一个j压入栈(此时,j=2)。最后依次读取(221)。

可见这涉及到编程语法和编译器如何处理。

如下:

#include<stdio.h>

int main()

{

     int i=0, j=0;

     printf("%d ,%d ,%d\n ",i,i++,i++);

     printf("此时i=%d\n ",i);                  // i=2

     printf("%d ,%d ,%d \n",j,++j,++j); 

        printf("此时j=%d\n",j);               //j = 2

      //

      return 0;

}

要想进一步学习这些,需要涉及到汇编,而不同的编译器可能具体机制不同,所以可能会产生不同结果。

最后,在实际编程中,我们要尽量避免此类现象,应该平时注意写规范、可读性好的代码。                                                       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值