【问题标题】:Compound assignment in C++C++ 中的复合赋值
【发布时间】:2021-04-24 22:41:33
【问题描述】:

我想知道C++中复合赋值的执行流程。我遇到了CodeChef question,我正在计算 NCR mod p 值并将它们加在一起以获得最终答案:

// correct
for(int i=min1; i<=max1; i+=2){
     ans = (ans+ncr_mod_p(n,i))%mod;
}
// incorrect
for(int i=min1; i<=max1; i+=2){
     ans+=ncr_mod_p(n,i)%mod;
}

这是因为整数溢出。

那么,复合赋值的执行顺序是怎样的呢?

假设我们有一个方程a+=b%c,那么执行顺序是什么:

a = (a+b)%c
// OR
a = a+(b)%c;

【问题讨论】:

  • 从最里面的括号开始。在括号中的操作相同的情况下,请参阅优先顺序。
  • 只是谷歌 cppreference 运算符优先级?复合分配在那里并不特别。
  • 我不是很自信。

标签: c++ assignment-operator compound-assignment


【解决方案1】:

此声明

ans+=ncr_mod_p(n,i)%mod;

等价于语句

ans = ans + ( ncr_mod_p(n,i)%mod );

如你所见,它与声明不同

ans = (ans+ncr_mod_p(n,i))%mod;

来自 C++ 14 标准(5.18 赋值和复合赋值运算符)

7 E1 op = E2 形式的表达式的行为是等价的 到 E1 = E1 op E2 除了 E1 只计算一次。 在 += 和 -=, E1 要么具有算术类型,要么是指向可能 cv 限定的完全定义的对象类型。在所有其他情况下,E1 应该有算术类型。

【讨论】:

    【解决方案2】:

    复合赋值运算符在 C++ 中的所有 second lowest precedence group 中(仅优先于逗号运算符)。因此,您的 a += b % c 案例将等同于 a += ( b % c )a = a + ( b % c )

    这解释了为什么您的两个代码 sn-ps 不同。第二个:

        ans+=ncr_mod_p(n,i)%mod;
    

    相当于:

        ans = ans + ( ncr_mod_p(n,i) % mod );
    

    这与第一个(正确的)表达式明显不同:

        ans = ( ans + ncr_mod_p(n,i) ) % mod;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-21
      • 1970-01-01
      • 2020-12-07
      • 2015-11-08
      • 2020-04-17
      • 1970-01-01
      • 2017-06-11
      相关资源
      最近更新 更多