【问题标题】:?: unexpected behaviour - although condition is true, the ? part is not executed?:意外行为 - 尽管条件为真,但 ?部分未执行
【发布时间】:2016-06-22 11:31:16
【问题描述】:

考虑这段代码:

// Example program
#include <stdio.h>

typedef enum{
  enum_1,
  enum_2
}my_enum;
/* 
 * this is not how the function works but when I debug 
 * it will always returns enum_1 (verified when using the debugger)
 * so I hope this is enough
 */    
int fun_1(int arg_1){return enum_1;} 
const int const_1 = 10;
const int const_2 = 20;
int main()
{
    int arg_1 = 0;

    int var_1 = fun_1(arg_1);

    int var_2 = (var_1 == (enum_1 
                    || enum_2))
                    ? const_1*10     // I expect this result
                    : const_2*10;    // instead I get this. why?
    printf("%d\n" , var_2);

    if(var_1==enum_1)
        var_2 = const_1*10;          // here it works fine        
    printf("%d\n" , var_2);

    return 0;
}

我正在调试这段代码,预计 var_1 会得到 enum_1 的值。确实如此,但不知何故,“?:”运算符没有给我预期的结果——它没有将const_1*10分配给var_2,而是const_2*10。当我在调试中继续前进并转到 if 语句时,我得到了预期的结果。这是为什么呢?

我在 Windows 8.1 上使用 windriver 工作台

编辑

我将示例更改为可运行版本,正如 tkausl 所述,问题在于使用 (var_1 == (enum_1 || enum_2)) 而不是 (var_1 == enum_1 || var_1 == enum_2))

【问题讨论】:

  • 你介意创建一个MCVE吗?
  • (enum_1 || enum_2) 产生一个布尔值。
  • 你的比较是错误的。检查@tkausl 的答案

标签: c if-statement operators


【解决方案1】:

您不是在比较var_1enum_1,也不是比较enum_2,而是比较(enum_1 || enum_2),您可能想要(var_1 == enum_1 || var_1 == enum_2)

【讨论】:

  • 哦... (enum_1 || enum_2) 会得到 1,因为它是真的?
  • 是的,如果两个枚举中的一个非零,那么这将始终为 1。
【解决方案2】:

enum1 为 0,enum2 为 1(如果您未明确指定枚举值,则为默认值)。

So (var_1 == (enum_1 || enum_2)) 计算结果为

(0 == (0 || 1)) 相当于

(0 == 1) 是 0。

因此,正如您所观察到的那样,表达式的计算结果为三元组的第二部分。

你想要var_1 == enum_1 || var_1 == enum_2吗?

【讨论】:

    【解决方案3】:
    var_1 == (enum_1 
                    || enum_2)
    

    enum_1 可能实现为 0,enum_2 实现为 1。因此

    (enum_1 || enum_2)
    

    基本上是(#include &lt;stdbool.h&gt; 便于阅读)

    (false || true)
    

    因此true,它 - 作为整数 - 表示为1。所以

    var_1 == 1
    

    var_1 的值为 enum_1(可能为 0)是 false

    你想要

    (var_1 == enum_1) || (var_1 == enum_2)
    

    作为条件。

    【讨论】:

    • “可能已实现”。实际上是肯定实现的。
    • @Bathsheba 如果标题(和枚举定义)真的是这样写的,那么是的。我更喜欢保持通用性,因为如果它们具有不同的关联值,上述推理也成立。
    • @Bathsheba 在这个例子中它肯定被实现为 0 和 1,但这只是一个例子。在我的真实代码中,我使用的两个枚举都大于 0,因此正如 Daniel 所怀疑的那样,它将被实现为 (true || true)
    • 正式是 1 || 1 在 C 中 - 在 int 类型中,(在 C++ 中为 true | true)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    相关资源
    最近更新 更多