C:条件表达式中的评估顺序

时间:2018-02-03 18:22:03

标签: c

有以下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

2

我尝试了3个编译器,结果是3。 为什么3是正确的结果?首先进行比较,然后指针递增,这意味着在上面的步骤4中,比较完成后,*a_p是3? 这总是行为(是定义了这种行为)还是依赖于编译器?

1 个答案:

答案 0 :(得分:3)

是的,后期增量是如何运作的。 while 01索引的while条件为true,但当它的计算结果为false时 - 指针值已经增加,因此它指向值为{{1的索引4 }}

3它的值为*p++,其中*p是旧的p,不会增加。 a_p在此处也是如此 - 上次比较值*a_p++2时,a_p的新值指向4th索引。循环结束并打印3