我正在阅读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
我无法理解帮助我理解它。
答案 0 :(得分: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);
}
答案 1 :(得分:2)
print(++ptr,ptr--,ptr,ptr++,++ptr);
是未定义的行为,因为C标准未指定评估参数的顺序。