?:意外行为 - 虽然条件属实,但是?部分未执行

时间:2016-06-22 11:31:17

标签: c if-statement operators

考虑以下代码:

// 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的值。确实如此,但不知怎的,&#34;? :&#34;运算符未向我提供预期结果 - 它不会将const_1*10分配给var_2,而是const_2*10。当我在调试中移动并转到if语句时,我得到了预期的结果。那是为什么?

我在Windows 8.1上使用windriver workbench

修改

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

3 个答案:

答案 0 :(得分:4)

您不是要将var_1enum_1进行比较,也不要将enum_2(enum_1 || enum_2)进行比较,您可能需要(var_1 == enum_1 || var_1 == enum_2)

答案 1 :(得分:1)

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吗?

答案 2 :(得分:1)

var_1 == (enum_1 
                || enum_2)

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

(enum_1 || enum_2)

基本上是(#include <stdbool.h>的可读性)

(false || true)

因而true,即 - 作为整数 - 表示为1。所以

var_1 == 1

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

你想要

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

作为条件。