您的位置:首页 > 编程语言 > C语言/C++

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

2012-10-17 22:26 323 查看
昨天在群里面聊天,一同学问的问题:

以下程序:

#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;

}

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

最后,在实际编程中,我们要尽量避免此类现象,应该平时注意写规范、可读性好的代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: