ipk*_*iss 20 c pointers increment operator-precedence dereference
我学习C语言和相当混乱之间的差异++*ptr和*ptr++.
例如:
int x = 19;
int *ptr = &x;
Run Code Online (Sandbox Code Playgroud)
我知道++*ptr并*ptr++产生不同的结果,但我不知道为什么会这样?
tem*_*def 47
由于运算符绑定的方式,这些语句产生不同的结果.特别是,前缀++运算符具有相同的优先级*,并且它们从右向左关联.从而
++*ptr
Run Code Online (Sandbox Code Playgroud)
被解析为
++(*ptr)
Run Code Online (Sandbox Code Playgroud)
意思是"增加指向的值ptr,".另一方面,后缀 ++运算符的优先级高于dereferrence运算符*.Thefore
*ptr++
Run Code Online (Sandbox Code Playgroud)
手段
*(ptr++)
Run Code Online (Sandbox Code Playgroud)
这意味着"评估当前指向的值ptr,并增加"的值ptr(未指定其顺序).
在您描述的上下文中,您可能想要编写++*ptr,这将x间接增加ptr.写作*ptr++会很危险,因为它会ptr前进过去x,而且由于x它不是数组的一部分,指针会悬浮在内存中的某个位置(也许在它自身之上!)
希望这可以帮助!
接受的答案是不正确的.事实并非后缀++运算符具有与解除引用/间接相同的优先级*.前缀和后缀运算符具有不同的优先级,只有前缀运算符具有与解除引用/间接相同的优先级.
作为优先顺序表所示,后缀++具有更高比解引用/间接优先*.因此*ptr++被评估为*(ptr++).ptr++评估当前值ptr; 它ptr仅作为副作用递增.表达式的值与当前值相同ptr.因此它不会对存储在指针处的值产生任何影响.它只是取消引用指针(即,获取存储在那里的当前值,即19),然后前进指针.在您的示例中,没有定义的值存储在新位置ptr,因此指针指向垃圾.现在取消引用它将是危险的.
同样如表所示,prefix ++与dereference/indirection具有相同的优先级*,但由于左右关联性,它被评估为++(*ptr).这将首先取消引用指针(即,获取存储在指向的地址处的值),然后递增该值.即,现在价值为20.
接受的答案对于两者的影响是正确的,但实际机制与那里给出的机制不同.