首页新闻找找看学习计划

关于C语言调用函数求值的问题。

0
悬赏园豆:20 [待解决问题]

include <stdio.h>

int main(void)
{
int add(x, y);
int x = 5,a;
a=add(--x,x++);
printf("结果是:%d", a);
getchar();
return 0;
}
int add(int x, int y)
{
int z;
z = x + y;
return z;
}
为什么vc6.0运行结果是9,而vs2017的结果是10

可顾可不顾的主页 可顾可不顾 | 初学一级 | 园豆:182
提问于:2018-12-26 17:27
< >
分享
所有回答(4)
0

在vc6.0中,你确定编译后显示是9?

LeeAaron | 园豆:206 (菜鸟二级) | 2018-12-26 17:55
0

怎么看结果都是8呀?我没实际去跑,楼主你能确认一下结果吗

Finder~ | 园豆:67 (初学一级) | 2018-12-26 18:47

你仔细检查一下自增自减运算符相对于x的位置,感觉你八成是你在两IDE中,运算符位置搞错了

支持(0) 反对(0) Finder~ | 园豆:67 (初学一级) | 2018-12-26 18:51

@Finder~: 我++x,x++,--x,x--十六种组合都试了一遍,还是没弄懂参数怎么传递的,我记得参数是从右往左传的,可是十六种并不都符合,而且vc和vs2017的结果不同

支持(0) 反对(0) 可顾可不顾 | 园豆:182 (初学一级) | 2018-12-26 21:22
0

建议你看一下鱼C工作室的一集汇编入门有提到过这样的问题:
https://www.bilibili.com/video/av28132657/?p=5
大概在12:51开始讲述。

导致的VC6.0的结果与其他编译器不一样的原因是因为 VC6.0编译器的一些“习惯”。
如果你利用反汇编来调试查看一下的话,你会知道原因的!

码农小易 | 园豆:316 (菜鸟二级) | 2018-12-27 10:58
0

里面声明的时候应该写作int add(int, int);
或者int add(int x, int y);
不过这里的问题不在于这里,假设我已经把此处改过了。
编译一下,

gcc -Wall test.c

test.c: In function ‘main’:
test.c:6:13: warning: operation on ‘x’ may be undefined [-Wsequence-point]
a=add(--x,x++);
^
这里有个警告,说明你的写法是有问题的,是未定义行为,在一个表达式里,你试图多次使用同一个变量,且对这个变量存在++、--这样的行为。永远不要这么写代码才是正途。
比如
x + x++
以上也是未定义行为。

窗户 | 园豆:827 (小虾三级) | 2019-01-30 18:36
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册