【问题标题】:Are these examples correct?这些例子正确吗?
【发布时间】:2020-06-17 22:48:16
【问题描述】:

this youtube video 中,我遇到了以下示例:

但是,对于第一个示例,它们对我来说似乎不正确:

*ptr++

在我的理解中,这意味着,如果++ 的优先级高于*,则在指针运算中将指针加1,然后获取存储在此新指针指向的地址中的值。所以代码

x = *ptr++;

应该等于,

ptr++;
x = *ptr;

这要么与视频冲突,要么我正在混合一些东西。你能告诉我我是对是错吗?

【问题讨论】:

  • 不,ptr++发布-增量。
  • @WeatherVane 哎呀,是的....谢谢
  • 优先级相关的地方如图所示,因此(*ptr)++ 使用括号覆盖优先级,增加数据而不是指针。
  • 请不要将问题编辑为“已解决”。相反,接受已发布的答案,或者如果没有,那么您可以自己写一个
  • *ptr++从指向的地址读取数据,然后递增指针。 (*ptr)++ 递增指向的数据。一切如图。括号强制编译器将++ 增量应用于*ptr 而不是ptr

标签: c pointers dereference pointer-arithmetic


【解决方案1】:

优先级会影响表达式的结构。它不影响操作的规则是什么。

*ptr++ 中,优先级表示++ 的规则应用于ptr,然后* 的规则应用于结果。

++ 的规则说,ptr++ 的结果值是操作开始时ptr 的值,另外,ptr 的值会增加。 ptr在内存中的实际增量可能发生在结果值产生之前、之中或之后,但不影响该值:无论何时,产生的值始终是增量之前ptr的值实际发生了增量。

* 的规则说结果是它的操作数指向的对象。因此,对于*ptr++,结果是ptr 在应用增量之前指向的对象。

【讨论】:

  • 关于“内存中 ptr 的增量可能发生在结果值产生之前、期间或之后”的要点
【解决方案2】:

如果不是 void 表达式,则每个表达式都有一个值。

后缀自增的值是其操作数自增前的值。

来自 C 标准(6.5.2.4 后缀递增和递减运算符)

2 后缀++运算符的结果是 操作数。作为副作用,操作数对象的值是 递增(即,将适当类型的值 1 添加到 它)

就是这个表情

*ptr++

被评估为

*( ptr++ )

括号中的表达式的值是指针(后缀增量的操作数)在递增操作数本身之前的值,这被评估为副作用。

这是后缀增量和前缀增量的区别(6.5.3.1 前缀增量和减量运算符)

2 前缀 ++ 运算符的操作数的值递增。 结果是操作数自增后的新值

知道后缀自增运算符可用于形成下标表达式,而前缀自增运算符则不能。

这是一个演示程序。

#include <stdio.h>

int main(void) 
{
    int a[] = { 1, 2 };
    int *p = &a[0];

    printf( "a[0] = %d, a[1] = %d\n", a[0], a[1] );

    p++[0] = 3;
    *p = 4;

    printf( "a[0] = %d, a[1] = %d\n", a[0], a[1] );

    return 0;
}

程序输出是

a[0] = 1, a[1] = 2
a[0] = 3, a[1] = 4

【讨论】:

    猜你喜欢
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-31
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    相关资源
    最近更新 更多