代码之家  ›  专栏  ›  技术社区  ›  missingfaktor Kevin Wright

以下代码是否调用未定义的行为?

  •  4
  • missingfaktor Kevin Wright  · 技术社区  · 15 年前
    #include <iostream>
    #include <cmath>
    
    #define max(x,y) (x)>(y)? (x): (y)
    
    int main() {
      int i = 10;
      int j = 5;
      int k = 0;
      k = max(i++,++j);
      std::cout << i << "\t" << j << "\t" << k << std::endl;
    }
    
    2 回复  |  直到 15 年前
        1
  •  12
  •   AnT stands with Russia    15 年前

    不,它没有。

    在这种情况下,情况是通过 ?: 运算符有 序列点 在计算第一个操作数(条件)之后,仅计算两个表达式(第二个或第三个操作数)中的一个。您的代码等价于

    ...
    bool c = i++ > ++j;
    k = c ? i++ : ++j;
    ...
    

    此处没有未定义的行为。

        2
  •  4
  •   dpb    15 年前

    嗯,当然有很多问题。

    • 最大值实际上是计算最小值
    • 由于使用宏,因此无论选择什么选项,增量运算符都会加倍。
    • 使用后缀/前缀增量只是为了混淆,但与问题没有太大关系。

    这段代码每次运行时都会产生相同的结果,所以不,它不是未定义的。在法庭上:

    i = 11
    k = 7
    j = 7
    

    这听起来像是一个糟糕的家庭作业问题。:)