This topic has been archived. It cannot be replied.
-
工作学习 / IT技术讨论 / 刚才写了一个C的小程序段来测试一条语句。在三个不同的平台下编译运行,输出结果居然各不相同。精通C的朋友来讨论一下吧。#include <stdio.h>
int main()
{
int a = 1;
int b = 3;
int result = (++a, b) + (a>b?4:50) + (a>b?a:20) + (a*=2, 6);
printf("result = %d", result);
return 0;
}
Visual C++ .NET 2003输出:33
Sun solaris cc输出: 17
Sun solaris CC输出: 79
-lionel(Lionel);
2004-5-16
{252}
(#1725617@0)
-
Undefined behaviour。 (++a, b) + (a>b?4:50) + (a>b?a:20) + (a*=2, 6)。C标准没有规定表达是付值得时候执行的顺序,各C compiler 实现都不相同。所以就会出现这种情况。不要写这样的表达式,除非你永远不会用到其他版本、其他平台的C compiler。有时候同意厂家的Compiler不同版本之间也可能不一样。我认为VC bug较多,UNIX平台的C,gcc更标准一些。
-canadiantire(正要戒网,结果...);
2004-5-16
{165}
(#1725630@0)
-
令我感到奇怪的是,同样一个a>b的判断在同一个编译器下会做出不同的选择。不同的编译器的选择相差更远。比如:gcc的选择是 第一个a>b成立,第二个a>b不成立
CC的选择是 第一个a>b成立,第二个a>b成立
cc的选择是 第一个a>b不成立,第二个a>b不成立
vb的选择是 第一个a>b不成立,第二个a>b成立
四种可能性都出现了,呵呵。。。
-lionel(Lionel);
2004-5-16
{205}
(#1725669@0)
-
gcc执行的顺序是这样的:a = 1
b = 3
t = b
a <= b :
t += 50 // t is 53
// take speical care at this step
a *= 2 // a is 4, now a i sgreater than b
a > b :
t+=a // a is 4, t is 57
t += 6 // t is 63
return t as b
-canadiantire(正要戒网,结果...);
2004-5-16
{251}
(#1725682@0)
-
Solaris的做法肯定是++a , a+=2 , compare a,b
-canadiantire(正要戒网,结果...);
2004-5-16
(#1725699@0)
-
VC .net 执行的顺序很明显,就是从左到右。结果正好是33。我猜想gcc先执行a*=2的原因是*= 的优先既要大于(?:)。我感觉VC是不那么“正确“的,虽然原则上说,谁的都不错。
-canadiantire(正要戒网,结果...);
2004-5-16
(#1725692@0)
-
我没有cc,自己算了一下,想让你帮助验证一下,cc或CC中一个的输出结果是否是:result = 79, a = 2, b = 3.
-canadiantire(正要戒网,结果...);
2004-5-16
(#1725728@0)
-
gcc = 63
-canadiantire(正要戒网,结果...);
2004-5-16
(#1725646@0)
-
compiler好象有个命令行参数可设表达式左向优先还是右向优先
-user7user8(nonick);
2004-5-16
(#1725684@0)
-
那时另一回事,是声明参数入站的顺序C convention or PASCAL convention。这里的不一致是运算优先级引起的。
-canadiantire(正要戒网,结果...);
2004-5-16
(#1725696@0)
-
what i mean is not the function param, but rather a command line parameter, which control a calculation a=b+c+d works like a=(b+(c+d)) or a=((b+c)+d)
-user7user8(nonick);
2004-5-16
(#1725701@0)
-
Really? pelase tell me if you find it. thanks.
-canadiantire(正要戒网,结果...);
2004-5-16
(#1725713@0)
-
实际上不是这个顺序的问题。只要保持++a在a*=2前面,两个(a>b)比较无论放在什么地方,结果不会发生变化。我的发现是,某些编译器会先计算所有单项逗号前面的语句,也就是先计算++a, a*=2,然后再累加b, a>b, a>b,6
-lionel(Lionel);
2004-5-16
(#1725783@0)
-
我设计这个表达式的最初目的是为了测试逗号运算符的特性,因为曾经在面试中被问到了这个。
-lionel(Lionel);
2004-5-16
(#1725774@0)