正确使用预增量运算符并结合指针解引用运算符

时间:2009-12-16 21:49:35

标签: c operators increment dereference

我刚写了以下代码:

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

我的意图是在countdata_ptr进行比较之前,在threshold指向的数据结构中增加data_ptr变量,这段代码可以正常工作。

如果我在进行比较之前想要增加if ((++data_ptr)->count > threshold) { /*...*/ } // example 2 ,我会写这个:

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

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

if

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

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

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

4 个答案:

答案 0 :(得分:11)

1)优先权

2)偏好

答案 1 :(得分:5)

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

为了回答你的第二个问题,我通常将这种类型的结构分成两个单独的陈述:

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

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

答案 2 :(得分:5)

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

    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...
    }
    

答案 3 :(得分:3)

  1. - >运算符比++更紧密。
  2. 他们都很明确,我认为他们很容易阅读。如果你在同一个表达式中有对data_ptr的额外引用,事情就会变得狡猾。