是printf("%d",*(++(*a)));
未定义?这里a
是指向整数的指针。
除此之外我没有其他代码了。它是This问题的扩展,引起了很多困惑。只想知道这个版本中发生了什么。它依赖于Architechture(32 Vs) 64)或编译器版本。
希望答案具有描述性和清晰性。
答案 0 :(得分:12)
如果你将其分解,它会这样做:
a
指向的值:*a
++(*a)
*(++(*a))
因此,如果a
中存储的值+ 1 是有效指针,则这将起作用。否则,结果未定义,很可能导致运行时错误。
答案 1 :(得分:3)
是的,你的代码是正确的,即使含糊不清也可以产生一些(小)意义:
void print_next(int **a) {
printf("%d\n",*(++(*a)));
}
int arr[] = {1,5,6,3,5,6};
int *p = arr;
while (p<arr+6)
print_next(&p);
答案 2 :(得分:2)
如果你的问题是关于*(++(*a))
表达式的,那么这里没有任何未定义的(假设所有涉及的指针都是有效的)。没有尝试对同一对象执行多个修改。没有任何修改对象的独立读取。故事结束。
基本上,这里没有什么可解释的,因为代码在相当直接的方式下完全没问题。实际上没有什么比这更具“描述性和清晰性”的空间了。
如果这还不够清楚,你必须在这个表达式中解释一下你看起来多么可疑。