啊哈磊_编程从这里起步

标题: 看不出来函数调用中的求值顺序 [打印本页]

作者: AACZY    时间: 2017-12-4 22:22
标题: 看不出来函数调用中的求值顺序
在课本中给的方法如下
#include<stdio.h>
void main()
{
        int i = 8;
        printf("%d,%d,%d,%d\n", ++i, --i, i++, i--);
        system("pause");
        return 0;
}
//从右到左执行则结果为8,7,7,8
//从左到右执行则结果为9,8,8,9

但是用啊哈C于VS2017求出来的结果都为8,8,7,8
这顺序看不出来...


作者: 4399APPLE    时间: 2017-12-4 22:22
未定义行为
编译器有权决定执行的顺序
刚好啊哈 C 和 VS 决定的顺序一样而已
作者: AACZY    时间: 2017-12-4 22:35
4399APPLE 发表于 2017-12-4 22:25
未定义行为
编译器有权决定执行的顺序
刚好啊哈 C 和 VS 决定的顺序一样而已

但这完全看不出顺序,难不成是乱序( ̄_ ̄|||)
作者: 4399APPLE    时间: 2017-12-5 12:04
AACZY 发表于 2017-12-4 22:35
但这完全看不出顺序,难不成是乱序( ̄_ ̄|||)

是的
没有任何办法知道是什么顺序
作者: AACZY    时间: 2017-12-5 15:57
那有方法使编译器的行为定义下来吗?
作者: AACZY    时间: 2017-12-5 16:40
4399APPLE 发表于 2017-12-5 12:04
是的
没有任何办法知道是什么顺序

#include<stdio.h>
void main()
{
        int i,j;
        for (j = 1; j <= 2; ) {
                i = 8;
                printf("%d,%d,%d,%d\n", ++i, --i, i++, i--);
                system("pause");
        }
        system("pause");
        return 0;
}
//从右到左执行则结果为8,7,7,8
//从左到右执行则结果为9,8,8,9
改了下代码,都是8878,编译器只判断一次吗?
而且发现,ahac与VS2017的运行界面好像啊,是不是同一个

4.PNG (101.91 KB, 下载次数: 19)

4.PNG

5.PNG (42.76 KB, 下载次数: 18)

5.PNG

作者: 4399APPLE    时间: 2017-12-5 18:08
AACZY 发表于 2017-12-5 15:57
那有方法使编译器的行为定义下来吗?

我们没有任何办法确定这个顺序
作者: 4399APPLE    时间: 2017-12-5 18:08
AACZY 发表于 2017-12-5 16:40
#include
void main()
{

我们也不知道编译器到底是怎么处理的
作者: 赵林    时间: 2017-12-9 16:10
换一个方式
写成四句printf,一句输出一个




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