搜索
查看: 927|回复: 10
打印 上一主题 下一主题

初学者求助!有个代码用啊哈C和VC++6.0编译出来结果不一样!

[复制链接]
跳转到指定楼层
楼主
发表于 2015-12-27 11:46:04 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
5啊哈币
我在某网站上看视频自学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:28 | 只看该作者
编译有两个警告:
1.main()函数的返回值没有了
2.printf()可能有问题
我用的g++ 弄出来了是15,15,15
这是调用函数入栈求值顺序不同导致的
啊哈c用的gcc(和g++一个德行的),是先求所有的再一个一个入栈
vc6是求一个,入一个
以后写程序的时候不要在实际参数修改变量的值
板凳
 楼主| 发表于 2015-12-27 13:34:05 | 只看该作者
邀请码 发表于 2015-12-27 13:08
编译有两个警告:
1.main()函数的返回值没有了
2.printf()可能有问题

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

好专业化。。。
9#
发表于 2016-7-9 20:40:02 | 只看该作者
邀请码 发表于 2015-12-27 14:29
参见c++11和c11函数调用入栈的规定。

问题是这是C89模式啊
10#
发表于 2016-7-9 20:42:54 | 只看该作者
本帖最后由 初学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标准编译)
编译的标准不同,结果自然不一样!



11#
发表于 2016-7-9 20:59:02 | 只看该作者
楼上难道这么简单的知识都不知道?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表