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

e.J*_*mes 7 c increment operators dereference

我刚写了以下代码行:

if (++(data_ptr->count) > threshold) { /*...*/ } // example 1
Run Code Online (Sandbox Code Playgroud)

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

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

if ((++data_ptr)->count > threshold) { /*...*/ } // example 2
Run Code Online (Sandbox Code Playgroud)

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

if (++data_ptr->count > threshold) { /*...*/ } // example 3
Run Code Online (Sandbox Code Playgroud)

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

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

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

小智 11

1)优先权

2)偏好


Mar*_*n B 5

是的,这是运营商优先权的问题.箭头运算符的优先级高于增量运算符.

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

++(data_ptr->count);
if(data_ptr->count > threshold) { /*...*/ }
Run Code Online (Sandbox Code Playgroud)

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


Jon*_*ler 5

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

例如:

if (...1...)
    ...2...
else if (++data_ptr->count > threshold)
    ...3...
else
    ...4...
Run Code Online (Sandbox Code Playgroud)

与:

if (...1...)
    ...2...
else
{
    ++data_ptr->count;
    if (data_ptr->count > threshold)
        ...3...
    else
        ...4...
}
Run Code Online (Sandbox Code Playgroud)