首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >printf行为

printf行为
EN

Stack Overflow用户
提问于 2011-06-23 13:17:20
回答 4查看 459关注 0票数 3

int ptr={10,20,30,40,50}为例我明白

代码语言:javascript
复制
print("%d", *ptr++);

在这样的声明中,运算符的计算是从右到左的。因此,在*ptr++中,++将首先得到评估,然后是ptr,然后是*,因此为了确认相同,我编写了一个程序

代码语言:javascript
复制
#include<stdio.h>
int main()
{
        int array[] = { 10, 20, 30, 40, 50 };
        int *q1 = array;
        printf("q1 = %p\n",q1);
      printf("*q1++ = %d\n",*q1++);
        printf("q1 = %p\n",q1);
      printf("*q1++ = %d\n",*q1);
}

根据上述逻辑,上述程序的输出与预期的操作符优先级不同。我得到的输出是

代码语言:javascript
复制
q1 = 0x7ffffcff02e0
*q1++ = 10
q1 = 0x7ffffcff02e4
*q1++ = 20

但我还以为

代码语言:javascript
复制
q1 = 0x7ffffcff02e0
*q1++ = 20
q1 = 0x7ffffcff02e4
*q1++ = 20

那么,操作符的优先级不是从右向左发生的吗?还是我的理解有什么不对?

更新

下面是thing.Even,如果我像前面提到的那样放置这些括号,那么*(ptr++)就会执行,输出不会改变--这里是新代码

代码语言:javascript
复制
#include<stdio.h>
int main()
{
        int array[] = { 10, 20, 30, 40, 50 };
        int *q1 = array;
        printf("q1 = %p\n",q1);
      printf("*q1++ = %d\n",*(q1++));// note the braces here *(q1++) so that () get evaluated 
        printf("q1 = %p\n",q1);
      printf("*q1++ = %d\n",*q1);
}

结果仍然是相同的注意,如您提到的使用大括号。输出仍然是

代码语言:javascript
复制
q1 = 0x7fff043f2120
*q1++ = 10 <-- I expected *q1++ = 20//since I used braces ()
q1 = 0x7fff043f2124
*q1++ = 20

所以,即使在我使用了大括号*(ptr++)之后,在当前行是executed.So之后,++操作仍然被执行,而executed.So没有工作吗?或者它没有优先于职位增值的事情?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-06-23 13:20:17

右边的++在计算值之前返回值。

代码语言:javascript
复制
printf("*q1++ = %d\n",*q1++);

是相同的

代码语言:javascript
复制
printf("*q1++ = %d\n",*q1);
++q1;
票数 6
EN

Stack Overflow用户

发布于 2011-06-23 13:19:16

不,操作人员不会从右到左被评估。有一个运算符优先表来下订单。

然而,这并不是你所看到的行为的原因。原因是您使用的是增量后运算符,这意味着在*q1++中,指针取消引用发生在添加之前的q1值上。

如果您将代码更改为读取*(++q1) (预增量操作符),您将看到所期望的行为。

票数 7
EN

Stack Overflow用户

发布于 2011-06-23 13:20:35

语句*ptr++;将首先计算ptr指向的值,然后递增ptr。若要先递增,请使用*++ptr;

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

https://stackoverflow.com/questions/6454638

复制
相关文章

相似问题

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