【问题标题】:C++ Precedence and AssociativityC++ 优先级和关联性
【发布时间】:2020-10-20 16:19:43
【问题描述】:

这段代码:

int scores[] {1,2,3,4};
int *score_ptr {scores};  
//let's say that initial value of score_ptr is 1000
std::cout<<*score_ptr++;

产生输出:

1

由于*++具有相同的优先级,然后关联性是从右到左,我们不应该先应用++运算符,即先增加指针然后再增加*(取消引用)吗?

因此,score_ptr 将相应地增加到 1004,然后取消引用它将给出分数的第二个元素,即 2

这如何以及为什么给我输出1 而不是2

【问题讨论】:

  • “关联性”这个词有问题。它在 C++ 17 标准中只使用过一次,并且在描述如何解析表达式的注释中。如何评估像*score_ptr++ 这样的表达式的规则不属于标准中的语法产生式。优先级和关联性“规则”(用于语言的非正式描述)源自这些规则,并不一定能准确告诉您实际规则是什么。

标签: c++ pointers computer-science operator-precedence


【解决方案1】:

由于*++ 具有相同的优先级

不,后缀operator++precedenceoperator* 高;那么*score_ptr++ 等价于*(score_ptr++)。请注意,postfix operator++ 将增加操作数并返回原始值,然后*(score_ptr++) 将给出值1

结果是操作数原始值的prvalue副本。

另一方面,前缀operator++ 返回递增值。如果您将代码更改为*++score_ptr(相当于*(++score_ptr)),那么结果将是2(这可能是您所期望的)。

【讨论】:

  • @Ranoiaetep 很好。 :)
【解决方案2】:

先自增,优先级更高,相当于*(score_ptr++),但它是后自增,这意味着它只会在使用解引用的指针后发生,即表达式到达;

如果你使用

std::cout << *++score_ptr;

然后你有一个预增量,这里它会提前发生,指针会在使用值之前递增,输出将是2。相当于*(++score_ptr)

请注意,使用括号总是一个好主意,它会使代码更清晰,并避免误解。

【讨论】:

    猜你喜欢
    • 2012-01-02
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    相关资源
    最近更新 更多