【发布时间】:2020-08-22 05:06:06
【问题描述】:
我正在练习指针算术,但 printf 语句的响应令人困惑。我的理解说首先应该打印 101,然后应该发生增量。但是问题出在这里...
#include <stdio.h>
int main()
{
int a[] = {101, 276, 345};
int *ptr = a;
printf ("%d\n%d\n", *ptr, *(++ptr) );
return 0;
}
它产生以下输出
276
276
但是,当我将代码更改为以下时
#include <stdio.h>
int main()
{
int a[] = {101, 276, 345};
int *ptr = a;
printf ("%d\n", *ptr);
return 0;
}
结果如下
101
【问题讨论】:
-
据我所知,答案应该是 101 276
-
欢迎来到 Undefined Behavior - 在
printf ("%d\n%d\n", *ptr, *(++ptr) );中,ptr的值是不确定的,因为没有定义参数的评估顺序——评估的顺序是不定。++ptr是先申请还是先申请?printf ("%d\n%d\n", *a, *(++ptr) );会很好。 -
这与指针运算关系不大。如果你打印这样的整数,你会遇到同样的问题。
-
停止在其行为一目了然难以理解的“聪明”代码中。将其分解为更小的步骤,通常使用更多的临时变量。
标签: c linux printf pointer-arithmetic