啊哈磊_编程从这里起步

标题: 初学者求助!有个代码用啊哈C和VC++6.0编译出来结果不一样! [打印本页]

作者: 可爱陈    时间: 2015-12-27 11:46
标题: 初学者求助!有个代码用啊哈C和VC++6.0编译出来结果不一样!
我在某网站上看视频自学C语言,然后有一串代码我分别用啊哈C和VC++6.0编译,结果出来结果不同,实在不明白怎么回事,求大神解答!!/(ㄒoㄒ)/~~
代码如下:
#include<stdio.h>
#include <stdlib.h>
main()
{
        int a=3,b=4;
    printf("%d,%d,%d",a+=7,a,a+=4,++a);
        system("pause");
        return 0;
}


啊哈C执行以后结果是15,15,15
VC执行后结果是15,8,8
这是咋回事啊!!!?

作者: 邀请码    时间: 2015-12-27 13:08
编译有两个警告:
1.main()函数的返回值没有了
2.printf()可能有问题
我用的g++ 弄出来了是15,15,15
这是调用函数入栈求值顺序不同导致的
啊哈c用的gcc(和g++一个德行的),是先求所有的再一个一个入栈
vc6是求一个,入一个
以后写程序的时候不要在实际参数修改变量的值
作者: 可爱陈    时间: 2015-12-27 13:34
邀请码 发表于 2015-12-27 13:08
编译有两个警告:
1.main()函数的返回值没有了
2.printf()可能有问题

不太明白。。。那哪个结果才是对的呀?
作者: zhuzhu81998    时间: 2015-12-27 13:34
因为a+=7,a+=4,++a都是表达式,所以编译器将它们计算完后把每个都看成a进行输出了
作者: zhuzhu81998    时间: 2015-12-27 13:36
而VC的话很有可能是输出的第一个是a,第二个是a加完4加完1后的结果
作者: zhuzhu81998    时间: 2015-12-27 13:36
第三个跟第二个一样
作者: 邀请码    时间: 2015-12-27 14:29
参见c++11和c11函数调用入栈的规定。
作者: 可爱陈    时间: 2015-12-27 15:37
邀请码 发表于 2015-12-27 14:29
参见c++11和c11函数调用入栈的规定。

好专业化。。。
作者: 初学C    时间: 2016-7-9 20:40
邀请码 发表于 2015-12-27 14:29
参见c++11和c11函数调用入栈的规定。

问题是这是C89模式啊
作者: 初学C    时间: 2016-7-9 20:42
本帖最后由 初学C 于 2016-7-9 20:58 编辑

初始代码:
[mw_shl_code=c,true]#include<stdio.h>
#include <stdlib.h>
main()
{
    int a=3,b=4;
    printf("%d,%d,%d",a+=7,a,a+=4,++a);
    system("pause");
}[/mw_shl_code]因为
a+=7,a+=4,++a
在一定(不是全部!)程度上,等价于:
a=a+7;
a=a+4;
a=a+1;
而printf函数会先将后面的值计算出来!,于是这个程序
相当于:
[mw_shl_code=c,true]#include<stdio.h>
#include <stdlib.h>
main()
{
    int a=3,b=4;
    a=a+7;
    a=a+4;
    a=a+1;
    printf("%d,%d,%d",a,a,a,a);
    system("pause");
}[/mw_shl_code]又因为a+=7之类的又是赋值语句,所以,a的值也随之改变、
最好的测试方法是看一看a的值是不是真的被改变了.
于是,我写出了下列代码测试:
[mw_shl_code=c,true]#include<stdio.h>
#include <stdlib.h>
main()
{
    int a = 0;
        printf("最开始:%d\n",a);
        printf("执行+=语句中:%d\n",a+=1);
        printf("最后:%d\n",a);
    system("pause");
    return 0;
}[/mw_shl_code]
测试结果:


可以发现,a的值已经被改变.
所以,不难得出,因为printf += ++这些赋值语句改变了a的值
所以,a最后的值就是:15

你的啊哈C应该是开启了C99模式(C99标准编译),但是VC6是C89(C89标准编译)
编译的标准不同,结果自然不一样!




作者: 初学C    时间: 2016-7-9 20:59
楼上难道这么简单的知识都不知道?




欢迎光临 啊哈磊_编程从这里起步 (https://bbs.codeaha.com/) Powered by Discuz! X3.2