【问题标题】:proper usage of the pre-increment operator in combination with the pointer dereference operator正确使用预增量运算符和指针解引用运算符
【发布时间】:2010-12-27 10:38:35
【问题描述】:

我刚刚写了下面这行代码:

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

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

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

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

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

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

发现它的行为和第一个完全一样。

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

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

【问题讨论】:

    标签: c operators increment dereference


    【解决方案1】:
    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...
    }
    

    【讨论】:

      【解决方案2】:

      1) 优先级

      2) 偏好

      【讨论】:

        【解决方案3】:

        是的,这是运算符优先级的问题。箭头运算符has higher precedence 比增量运算符。

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

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

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

        【讨论】:

          【解决方案4】:
          1. -> 运算符的绑定比 ++ 更紧密。
          2. 它们都定义明确,我认为它们很容易阅读。只有在同一个表达式中有对 data_ptr 的额外引用时,事情才会变得棘手。

          【讨论】:

            猜你喜欢
            • 2016-12-01
            • 2015-10-21
            • 2011-05-14
            • 1970-01-01
            • 1970-01-01
            • 2018-01-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多