7

我刚刚写了以下代码行:

if (++(data_ptr->count) > threshold) { /*...*/ } // example 1

我的意图是在与 进行比较之前增加指向count的数据结构中的变量,并且这行代码有效。data_ptrthreshold

如果我想data_ptr在进行比较之前增加,我会这样写:

if ((++data_ptr)->count > threshold) { /*...*/ } // example 2

出于好奇,我也尝试了这行代码:

if (++data_ptr->count > threshold) { /*...*/ } // example 3

并发现它的行为与第一个完全相同。

第一个问题: 为什么示例 #3 与示例 #1 的工作方式相同?这是操作员优先级的问题吗?标准中的东西?我不得不编写一个快速测试程序,因为答案对我来说并不明显。

第二个问题:我应该以if不同的方式写这个陈述吗?我可以先在自己的行上执行增量,然后测试条件以避免任何可能的混淆。这是必要的,还是前两个例子本身就足够明显?

4

4 回答 4

11

1) Precedence

2) Preference

于 2009-12-16T21:55:23.707 回答
5

是的,这是运算符优先级的问题。箭头运算符的优先级高于增量运算符。

为了回答您的第二个问题,我通常会将这种类型的构造分成两个单独的语句:

++(data_ptr->count);
if(data_ptr->count > threshold) { /*...*/ }

这强调了正在发生的事情并消除了可能的混淆。然而,这可能是一个偏好问题。

于 2009-12-16T21:54:13.537 回答
5
  1. 运算符优先级决定了您观察到的行为。
  2. 如果您在本例中将增量与比较分开不会有太大影响,但有时您希望在一系列条件中间有一个带有增量的条件,然后尝试将增量与测试分开可能会损害通过引入原本不必要的嵌套来提高代码的可读性。

例如:

if (...1...)
    ...2...
else if (++data_ptr->count > threshold)
    ...3...
else
    ...4...

相对:

if (...1...)
    ...2...
else
{
    ++data_ptr->count;
    if (data_ptr->count > threshold)
        ...3...
    else
        ...4...
}
于 2009-12-16T21:56:47.713 回答
3
  1. -> 运算符的绑定比 ++ 更紧密。
  2. 它们都定义明确,我认为它们很容易阅读。如果您在同一个表达式中有对 data_ptr 的额外引用,事情只会变得狡猾。
于 2009-12-16T21:53:44.907 回答