-2

我正在阅读理解 c 中的指针。

我在这里找到了一个程序。

#include<Stdio.h>
#include<conio.h>
int main()
{
    static int arr[]={97,98,99,100,101,102,103,104};
    int *ptr=arr+1;
    printf("\nThe base Address is:%u\n",arr);
    print(++ptr,ptr--,ptr,ptr++,++ptr);
    return getch();
}

print(int *a,int *b,int *c,int *d,int *e)
{
      printf("%d  %d  %d  %d  %d",*a,*b,*c,*d,*e);
}

该程序非常完美,我认为它必须生成以下输出:99 99 98 98 100。但它提供以下输出:100 100 100 99 99

我无法理解帮助我理解它。

4

2 回答 2

4

除了未指定函数参数的求值顺序外,该程序还显示了几个具有未定义行为的项目:

  • 它尝试在到达下一个序列点之前访问具有副作用的表达式的值(它在调用中多次这样做print),并且
  • 它尝试使用%u格式说明符打印指针。

程序的编写方式可以打印任何内容,不打印任何内容,甚至崩溃:这就是未定义行为的后果。

如果您希望按特定顺序评估参数,请引入临时变量,并按顺序进行评估,如下所示:

#include<stdio.h>
#include<conio.h>
int main()
{
    static int arr[]={97,98,99,100,101,102,103,104};
    int *ptr=arr+1;
    printf("\nThe base Address is:%p\n",(void*)arr);
    int *tmp0 = ++ptr;
    int *tmp1 = ptr--;
    int *tmp2 = ptr;
    int *tmp3 = ptr++;
    int *tmp4 = ++ptr;
    print(tmp0, tmp1, tmp2, tmp3, tmp4);
    return getch();
}
print(int *a,int *b,int *c,int *d,int *e)
{
      printf("%d  %d  %d  %d  %d",*a,*b,*c,*d,*e);
}
于 2013-10-16T11:45:23.997 回答
2
print(++ptr,ptr--,ptr,ptr++,++ptr);

是未定义的行为,因为 C 标准未指定评估参数的顺序。

于 2013-10-16T11:43:10.787 回答