相同的代码,不同编译器下结果不同,究竟哪个是正确的?该如何处理
相同的代码,不同编译器下结果不同,究竟哪个是正确的?
代码如下:
#include<stdio.h>
void fun(int i,int n);
main( ){
short x=5,y,z;
printf("+1 after use:\ny=%d\n",y=x++*x++);
printf("x=%d\n",x);
x=5;
printf("+1 before use:\nz=%d\n",z=++x*++x);
printf("x=%d\n",x);
int m=6;
m+=m-=m*m;
printf("m=%d\n",m);
int i=0;
fun(i++,i++);
}
void fun(int i,int n){
printf("%d\t%d\n",i,n);
}
这段代码,我分别用VC6.0、C-Free5、LCC-Win32及LabWindows/CVI四种编译器编译并运行,编译都没有问题,运行结果如下:
1,VC6.0:
+1 after use:
y=25
x=7
+1 before use:
Z=42
x=7
m=-60
0 0
2, C-Free5
+1 after use:
y=30
x=7
+1 before use:
Z=42
x=7
m=-60
1 0
3, LCC-Win32
+1 after use:
y=30
x=7
+1 before use:
Z=42
x=7
m=-24
1 0
4, LabWindows/CVI
+1 after use:
y=30
x=7
+1 before use:
Z=42
x=7
m=-24
1 0
请各位高手帮忙详细解答下,谢谢!
------解决方案--------------------
看到你这问题,还真不好回答,,其实,每种编译器的语法分析都有一些差别,你只能说在标准ANSI C 的编译下会是那种结果。如果是标准ANSI C 下来说,LCC是对的。因为我没太仔细看,我只是记得好像LCC的编译器是完全符合C99规范。所以我说LCC。2,4两种编译器没怎么使过。
------解决方案--------------------
未定义行为,不同编译器对其有不同的处理,结果不同属于正常现象,这个没有所谓的谁对谁错。
建议:不要写连自己都无法预测结果的代码
看看这个:http://www.c-faq.com/expr/index.html
------解决方案--------------------
http://topic.****.net/u/20110826/09/601ebe9c-c2ae-4d63-a4e2-506c618bb654.html?24709
------解决方案--------------------
都正确。
不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
代码如下:
#include<stdio.h>
void fun(int i,int n);
main( ){
short x=5,y,z;
printf("+1 after use:\ny=%d\n",y=x++*x++);
printf("x=%d\n",x);
x=5;
printf("+1 before use:\nz=%d\n",z=++x*++x);
printf("x=%d\n",x);
int m=6;
m+=m-=m*m;
printf("m=%d\n",m);
int i=0;
fun(i++,i++);
}
void fun(int i,int n){
printf("%d\t%d\n",i,n);
}
这段代码,我分别用VC6.0、C-Free5、LCC-Win32及LabWindows/CVI四种编译器编译并运行,编译都没有问题,运行结果如下:
1,VC6.0:
+1 after use:
y=25
x=7
+1 before use:
Z=42
x=7
m=-60
0 0
2, C-Free5
+1 after use:
y=30
x=7
+1 before use:
Z=42
x=7
m=-60
1 0
3, LCC-Win32
+1 after use:
y=30
x=7
+1 before use:
Z=42
x=7
m=-24
1 0
4, LabWindows/CVI
+1 after use:
y=30
x=7
+1 before use:
Z=42
x=7
m=-24
1 0
请各位高手帮忙详细解答下,谢谢!
------解决方案--------------------
看到你这问题,还真不好回答,,其实,每种编译器的语法分析都有一些差别,你只能说在标准ANSI C 的编译下会是那种结果。如果是标准ANSI C 下来说,LCC是对的。因为我没太仔细看,我只是记得好像LCC的编译器是完全符合C99规范。所以我说LCC。2,4两种编译器没怎么使过。
------解决方案--------------------
未定义行为,不同编译器对其有不同的处理,结果不同属于正常现象,这个没有所谓的谁对谁错。
建议:不要写连自己都无法预测结果的代码
看看这个:http://www.c-faq.com/expr/index.html
------解决方案--------------------
http://topic.****.net/u/20110826/09/601ebe9c-c2ae-4d63-a4e2-506c618bb654.html?24709
------解决方案--------------------
都正确。
不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!