【发布时间】:2014-06-12 09:14:21
【问题描述】:
int main( )
{
int k = 35 ;
printf ( "\n%d %d %d", k == 35, k = 50, k > 40 ) ;
}
上述程序的输出是“0 50 0”,不带引号。我的问题是k==35 和k > 40 怎么是假的?从我的角度来看,k 被分配了 35,所以“k==35”应该是真的;那么k 在 "k=50" 中被赋值为 50,所以 "k > 40" 必须为真,不是吗?
【问题讨论】:
-
向我们证明“then”部分
-
@pmg:这是未定义的行为,而不仅仅是未指定的执行顺序。
-
@pmg:
printf("%d %d\n", 42 + 1, 42 - 1);是完全定义的行为。你无法判断 43 是在 41 之前还是之后计算的,但这并不重要,因为这两种计算都不影响另一个。 UB 正在修改在整个表达式(printf()语句)中其他地方使用的变量。使用++k或k--或对k的任何分配以及在其他地方引用k都是有问题的。请注意,printf("%d %d\n", 42 + 1, k -= 3);是已定义的行为;k的值只使用一次。