level 5
由于表达式的求值顺序并非完全由操作符的优先级决定,因此有了以下讨论:i + --i 的结果是多少?操作符的优先级规则要求自减运算在加法运算之前进行,但我们没有办法得知加法操作符的左操作数是在右操作数之前还是之后进行求值.由于自减操作符具有副作用.--i 在 i 之前或之后执行,表达式的结果在两个情况下将会不同.标准说明类似这种表达式的值是未定义的.尽管每种编译器都会为这个表达式产生某个值,但到底哪个是
正确的
并无标准答案.因此,像这样的表达式是不可移植,应该予以避免.下面这个程序将说明这个问题.//bad_exp.c#include
main(){ int i = 10; i = i-- - --i * ( i = - 3 ) * i++ + ++i; printf( "i = %d\n", i );}非法表达式结果:值 编译器-128 Tandy 6000 Xenix 3.2-95 Think C 5.02( Macintosh )-86 IBM PowerPC AIX 3.2.5-85 Sun Sparc acc( K&C编译器 )-63 gcc,HP_UX 9.0, PowerC.2.04 Microsoft C++ 7.021 Turbo C/C++ 3.0, Turbo C/C++ 4.522 FreeBSD 2.1R30 Dec Alpha OSF1 2.036 Dec VAX/VMS42 Microsoft 5.1你可以看到结果如此戏剧性.许多编译器由于是否添加了优化措施而导致结果不同.例如:在gcc中使用了优化器后,程序的值从-63变成了22.尽管每个编译器以不同的顺序计算这个表达式,但你不能说任何一种方法是错误的!这是由于表达式本身的缺陷引起的,由于它包含了许多具有副作用的操作符,因此它的求值顺序存在歧义.以下表达式,你可以在你的C编译器试验一下:i = ( i-- ) + ( ++i );i = j + j++;k *= k++;以下为C++的:你能遇见他们的结果吗?cout<<++( ++i )<< ',' << i<
2005年10月03日 04点10分
1
正确的
并无标准答案.因此,像这样的表达式是不可移植,应该予以避免.下面这个程序将说明这个问题.//bad_exp.c#include
main(){ int i = 10; i = i-- - --i * ( i = - 3 ) * i++ + ++i; printf( "i = %d\n", i );}非法表达式结果:值 编译器-128 Tandy 6000 Xenix 3.2-95 Think C 5.02( Macintosh )-86 IBM PowerPC AIX 3.2.5-85 Sun Sparc acc( K&C编译器 )-63 gcc,HP_UX 9.0, PowerC.2.04 Microsoft C++ 7.021 Turbo C/C++ 3.0, Turbo C/C++ 4.522 FreeBSD 2.1R30 Dec Alpha OSF1 2.036 Dec VAX/VMS42 Microsoft 5.1你可以看到结果如此戏剧性.许多编译器由于是否添加了优化措施而导致结果不同.例如:在gcc中使用了优化器后,程序的值从-63变成了22.尽管每个编译器以不同的顺序计算这个表达式,但你不能说任何一种方法是错误的!这是由于表达式本身的缺陷引起的,由于它包含了许多具有副作用的操作符,因此它的求值顺序存在歧义.以下表达式,你可以在你的C编译器试验一下:i = ( i-- ) + ( ++i );i = j + j++;k *= k++;以下为C++的:你能遇见他们的结果吗?cout<<++( ++i )<< ',' << i<