int i = 5, j = 10, k = 1;
printf("%d\n", k > i < j);
为什么打印出1?
希望它什么都不会打印,因为这应该是非法的。但是,如果我们绝对必须这样做:
k > i < j
将分为两部分:k > i
,然后将其结果与 进行比较j
。像这样比较的结果是 1 iftrue
或 0 if false
。因为k > i
是false
,我们得到 0;那么我们0 < j
得到true
1。因此,这将打印 1。
首先,您需要弄清楚评估操作的顺序。使用此表中的关联性列寻求帮助。接下来,弄清楚 的值是多少k > i
。printf
用来试一试。最后,算出最后一个表达式的值,运行程序看看你的答案是否正确。
k > i < j
是一个表达式,在printf
被调用之前它会被完全计算;一切printf
都会看到的是评估的结果。至于它的评估结果,运算符只是从右到左单独评估;sok > i
将首先被评估,然后是应用于右侧<
的结果。j
请注意,如果我们有除<
and以外的运算符,这可能会有所不同>
;这些恰好具有相同的优先级,因此它们总是从左到右进行评估。另一方面,如果我们有k + i * j
,i * j
将首先被评估。这是因为*
具有比 更高的优先级+
。