为什么该程序不打印“ 4”?

时间:2019-06-10 08:15:29

标签: c pointers postfix-operator

* ptrj ++执行后,ptrj值不应该为4吗?

int j=3,*ptrj = NULL;
ptrj = &j;
*ptrj++;
printf("%i",*ptrj);

4 个答案:

答案 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