首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个程序不打印'4'?

为什么这个程序不打印'4'?
EN

Stack Overflow用户
提问于 2019-06-10 08:15:29
回答 4查看 148关注 0票数 3

在*ptrj++执行之后,ptrj值不应该是4吗?

代码语言:javascript
复制
int j=3,*ptrj = NULL;
ptrj = &j;
*ptrj++;
printf("%i",*ptrj);
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-06-10 08:18:22

*ptrj++*(ptrj++)是一样的。您所期望的是(*ptrj)++。您应该查找操作符优先级,以了解哪些运算符比其他操作符更早。要了解ptrj++的功能,您应该阅读指针算法。但这里有一个快速的解释:

  • *(ptrj++)返回ptrj指向(3)的值,然后递增ptrj以指向下一个值。
  • (*ptrj)++返回ptrj指向(3)的值,然后将ptrj指向的值从3增加到4。

这意味着您要打印的是地址&j + 1处的值,该值位于内存中变量j之后。这是未定义的行为。正如Sourav所指出的,如果启用编译器警告,您将得到一个指向此的警告。

*ptrj++ptrj++之间唯一的区别在于它返回的内容。由于您不使用返回值,所以您的代码相当于:

代码语言:javascript
复制
int j=3,*ptrj = NULL;
ptrj = &j;
ptrj++;
printf("%i",*ptrj);
票数 8
EN

Stack Overflow用户

发布于 2019-06-10 08:19:40

如果您在启用警告的情况下编译程序,您将看到

代码语言:javascript
复制
source_file.c:9:5: warning: value computed is not used [-Wunused-value]
     *ptrj++;
     ^

这意味着,价值计算是无用的。

换句话说,根据运算符优先 *ptrj++;*(ptrj++);相同,并且根据增量后操作符属性,操作的值是操作数的值,值作为副作用增加。

引用C11,第一章

后缀++操作符的结果是操作数的值。副作用是,操作数对象的值增加(也就是说,适当类型的值1被添加到它中)。……

所以,这和

代码语言:javascript
复制
 *ptr;
  ptr++;

如果要在地址上增加该值,则需要使用显式括号强制执行运算符优先级,如

代码语言:javascript
复制
(*ptrj)++;   // first get the value, then update the value.
票数 1
EN

Stack Overflow用户

发布于 2019-06-10 08:22:35

*ptrj++相当于*(ptrj++)。

可以使用(*ptrj)++实现所需的输出。

请参考https://www.geeksforgeeks.org/c-operator-precedence-associativity/以了解操作员的工作方式。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56522783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档