有以下C代码:
#include <stdio.h>
int main ()
{
int a[5] = {0, 1, 2, 3, 4};
int* a_p = a;
float x = 1.5;
while(x > (*a_p++))
{
printf("*a_p = %d\n", *a_p);
}
printf("*a_p = %d", *a_p);
return 0;
}
问题是最终printf
陈述的结果是什么?
我会判断订单是:
1)在while
内,a_p
地址递增=&gt; *a_p
为1(a[1]
)
2)1.5与1
进行比较 3)在while
内,a_p
地址再次递增=&gt; *a_p
为2(a[2]
)
4)1.5与2
进行比较 5)打印*a_p
我尝试了3个编译器,结果是3。
为什么3是正确的结果?首先进行比较,然后指针递增,这意味着在上面的步骤4中,比较完成后,*a_p
是3?
这总是行为(是定义了这种行为)还是依赖于编译器?
答案 0 :(得分:3)
是的,后期增量是如何运作的。 while 0
和1
索引的while条件为true,但当它的计算结果为false时 - 指针值已经增加,因此它指向值为{{1的索引4
}}
3
它的值为*p++
,其中*p
是旧的p
,不会增加。 a_p
在此处也是如此 - 上次比较值*a_p++
为2
时,a_p
的新值指向4th
索引。循环结束并打印3
。