回 帖 发 新 帖 刷新版面

主题:请教这个特殊的:++1与1++的问题.

(2)请看以下程序:


① 试人工分析程序的输出,并将结果
写在下面
         -1        

②上机运行该程序,将运行结果写在下面

          0  

③ 如果两个结果不一样,试分析为什么?

【为什么输出的是0而不是-1】?
如果把++i改为i++,为什么输出的是1了???

请教一下,我的老师她说她也不清楚。。。。



#include <stdio.h>
void main()
{
    int f(int a,int b);
    int i=2,p;
    p=f(i,++i);
    printf("%d\n",p);
}

int f(int a,int b)
{
    int c;
    if(a>b) c=1;
    else if(a==b) c=0;
    else c=-1;
    return(c);
}

回复列表 (共6个回复)

沙发

函数入栈方式自右向左。
f(i,++i);先++i,返回时i = 3;可以理解为f(3,3);
对应的
    mov    eax, DWORD PTR _i$[ebp]
    add    eax, 1
    mov    DWORD PTR _i$[ebp], eax
    mov    ecx, DWORD PTR _i$[ebp]
    push   ecx
    mov    edx, DWORD PTR _i$[ebp]
    push   edx
f(i,i++);仍然先计算i++,但是这里的实现应该是看编译器的,并不是说结果一定是1吧。我在VC6中运行结果是0,在C-Free5.0中运行是1.这个结果是未定义的。(具体原因参考 “序列点”)

板凳

++i 先自增然后取值参与接下来的运算
i++ 先参与接下来的运算然后自增

3 楼

同意一楼观点,主要是看是在什么编辑环境中。

4 楼

就不应该写这种具有副作用的代码: p=f(i,++i);

5 楼


 p=f(i,++i);
这个地方有点危险,建议写成:
j=++i;
p=f(i,j);
个人意见。

6 楼

支持五楼

我来回复

您尚未登录,请登录后再回复。点此登录或注册