【问题标题】:Does the following C/C++ code invoke undefined behavior? [duplicate]以下 C/C++ 代码是否会调用未定义的行为? [复制]
【发布时间】:2015-05-26 14:08:30
【问题描述】:
int a = 2, b = 3, c = 4, d = 5;
a > 1 ? b : c = d;

我的一个朋友告诉我,这会引发未定义的行为,而我的感觉恰恰相反。谁能帮帮我?

【问题讨论】:

  • 对我来说看起来不错。为什么他认为它会给出未定义的行为?
  • 选择一种语言。 C/C++ 不是一种语言。
  • 因为它在 C 和 C++ 中的行为可能不同,所以我很高兴听到这两种语言之间的细节/差异。
  • @porker2008;区别在于 C != C++。不要比较。
  • 使用术语“C/C++”调用未定义的答案。

标签: c++ c variable-assignment ternary-operator undefined-behavior


【解决方案1】:

如果写运算符就好了

( a > 1 ? b : c ) = d;

(因为它是在 C 中解析的)那么它在 C++ 中是有效的,但不会在 C 中编译,因为在 C 中运算符返回右值。

如果要删除括号,那么在 C++ 中它将等同于

a > 1 ? b : ( c = d );

因此,运算符在 C 和 C++ 中的行为不同。在C记录中

a > 1 ? b : c = d;

等价于

( a > 1 ? b : c ) = d;

并且不会被编译。

在 C++ 记录中

a > 1 ? b : c = d;

等价于tp

a > 1 ? b : ( c = d );

并将被编译。

此外,如果用 C++ 重写它,就像在 C 中解析它一样

( a > 1 ? b : c ) = d;

然后它将再次被编译,因为 C++ 中的运算符返回左值。

这里是C中运算符的定义

conditional-expression:
       logical-OR-expression
       logical-OR-expression ? expression : conditional-expression

这里是C++中运算符的定义

conditional-expression:
       logical-or-expression
       logical-or-expression ? expression : assignment-expression

如您所见,除了语义上的差异之外,运算符相对于第三个表达式的语法也存在差异。

【讨论】:

    【解决方案2】:

    此代码不会调用未定义的行为,但会在 C 中产生一些错误,因为 a > 1 ? b : c = d; 将被评估为

    (a > 1 ? b : c) = d;  
    

    a > 1 ? b : c 将产生一个右值,它不能是赋值运算符= 的左操作数。

    【讨论】:

    • 注意:上述错误仅适用于c(代码有效c++)。
    猜你喜欢
    • 2015-02-16
    • 2014-08-04
    • 1970-01-01
    • 2013-04-16
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多