2016-06-22 1 views
0

Рассмотрим этот код:?: Непредвиденное поведение - хотя условие верно,? часть не выполняется

// 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*10var_2, но const_2*10. Когда я двигаюсь в отладке и перехожу к выражению if, я получаю ожидаемый результат. Почему это?

Я использую WinDriver верстак на окнах 8.1

EDIT

Я изменил пример к работоспособным версиям, и как уже упоминались tkausl, проблема была с помощью (var_1 == (enum_1 || enum_2)) вместо (var_1 == enum_1 || var_1 == enum_2))

+1

Вы хотите создать [___MCVE___] (http://stackoverflow.com/help/mcve)? –

+1

'(enum_1 || enum_2)' создает bool. –

+1

ваше сравнение неверно. проверить ответ @tkausl –

ответ

4

Вы не сравниваете var_1 с enum_1, не с enum_2, а с (enum_1 || enum_2), вероятно, вы хотите (var_1 == enum_1 || var_1 == enum_2)

+0

oh ... (enum_1 || enum_2) приведет к 1, потому что это правда? – CIsForCookies

+1

Да, если одно из обоих перечислений отличное от нуля, это всегда будет 1. – tkausl

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?

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) ложно.

Вы хотите

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

как условие.

+0

", вероятно, реализован". Фактически ** определенно ** реализован. – Bathsheba

+0

@Bathsheba Если заголовок (и определение перечисления) действительно написан таким образом, тогда да. Я предпочитаю держать его общим, так как выше рассуждения также имеют место, если у них разные значения. –

+0

За исключением случаев, когда 'enum_1 == 1' конечно –