* ptrj ++执行后,ptrj值不应该为4吗?
int j=3,*ptrj = NULL;
ptrj = &j;
*ptrj++;
printf("%i",*ptrj);
答案 0 :(得分:8)
*ptrj++
与*(ptrj++)
相同。您期望的是(*ptrj)++
。您应该查看运算符优先级,以了解有关哪些运算符先于其他运算符的信息。要了解ptrj++
的作用,您应该阅读指针算术。但这是一个简单的解释:
*(ptrj++)
返回ptrj
指向(3)的值,然后THEN递增ptrj
指向下一个值。
(* ptrj)++返回ptrj
指向(3)的值,然后将ptrj
指向的值从3递增到4。
这意味着您要打印的是地址&j + 1
上的值,该值位于内存中变量j
的 之后。这是未定义的行为。正如Sourav所指出的,如果启用了编译器警告,您将得到一条警告,指出您这一点。
*ptrj++
和ptrj++
之间的唯一区别就是返回的内容。并且由于您不使用返回值,因此您的代码等效于:
int j=3,*ptrj = NULL;
ptrj = &j;
ptrj++;
printf("%i",*ptrj);
答案 1 :(得分:2)
如果在启用警告的情况下编译程序,则会看到
source_file.c:9:5: warning: value computed is not used [-Wunused-value]
*ptrj++;
^
这意味着,价值计算毫无用处。
换句话说,根据operator precedence *ptrj++;
与*(ptrj++);
相同,并且根据post-increment运算符属性,运算的值为运算数的值,并且该值会随着副作用的增加而增加。
在C11
章
后缀
++
运算符的结果是操作数的值。作为副作用, 操作数对象的值递增(即,适当类型的值1为 添加到它)。 [....]
所以,这与
相同 *ptr;
ptr++;
如果要在地址处增加该值,则需要使用显式括号来强制运算符优先级,例如
(*ptrj)++; // first get the value, then update the value.
答案 2 :(得分:1)
*ptrj++
等效于*(ptrj ++)。
所需的输出可以使用(* ptrj)++实现。
请参考https://www.geeksforgeeks.org/c-operator-precedence-associativity/以获得操作员的工作方式。
答案 3 :(得分:1)
后缀++的优先级高于*。由于后缀++的优先级高于*,因此表达式* ptrj ++被视为*(ptrj ++)。如果要打印4(即ptrj + 1),则应使用以下代码:-
int j=3,*ptrj = NULL;
ptrj = &j;
(*ptrj)++;
printf("%i",*ptrj);
return 0;
要了解有关运算符优先级的更多信息,请参阅以下链接: https://en.cppreference.com/w/c/language/operator_precedence