2016-06-22 7 views
0

diesen Code vor:?: Unerwartetes Verhalten - obwohl die Bedingung erfüllt ist, die? Teil nicht ausgeführt

// 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; 
} 

ich diesen Code bin Debuggen und var_1 wird erwartet, dass der Wert von enum_1 zu bekommen. Es tut, aber irgendwie gibt der Operator "?:" Mir das erwartete Ergebnis nicht - es weist const_1*10 zu var_2 aber const_2*10 nicht zu. Wenn ich im debug mitfahre und zur if-Anweisung gehe, bekomme ich das erwartete Ergebnis. Warum das?

Ich bin mit Windriver Werkbank auf Windows 8.1

EDIT

änderte ich das Beispiel auf eine ausführbare Version, und wie durch tkausl erwähnt, das Problem (var_1 == (enum_1 || enum_2)) wurde anstelle von (var_1 == enum_1 || var_1 == enum_2))

+1

Sie kümmern sich um ein [___MCVE___] (http://stackoverflow.com/help/mcve)? –

+1

'(enum_1 || enum_2)' erzeugt ein bool. –

+1

Ihr Vergleich ist falsch. check @tkausls Antwort –

Antwort

4

Sie vergleichen nicht var_1 zu enum_1, noch zu enum_2, sondern zu (enum_1 || enum_2), wahrscheinlich möchten Sie (var_1 == enum_1 || var_1 == enum_2)

+0

oh ... (enum_1 || enum_2) ergibt 1, weil es wahr ist? – CIsForCookies

+1

Ja, wenn eines der beiden Enums nicht Null ist, dann ist dies immer 1. – tkausl

1

enum1 ist 0, und enum2 ist 1 (die Standardwerte, wenn Sie die Enum-Werte nicht explizit angeben).

So (var_1 == (enum_1 || enum_2)) ausgewertet

(0 == (0 || 1)), die

entspricht

(0 == 1), die 0 ist

So ist der Ausdruck auf den zweiten Teil des ternären auswertet, wie Sie beobachten.

Wollte Sie var_1 == enum_1 || var_1 == enum_2?

1
var_1 == (enum_1 
       || enum_2) 

enum_1 wahrscheinlich als 0, enum_2 als 1. Somit

(enum_1 || enum_2) 

ist im Grunde (#include <stdbool.h> zur besseren Lesbarkeit)

(false || true) 

und damit true, die implementiert ist - wie integer - dargestellt als 1. So

var_1 == 1 

mit var_1 den Wert enum_1 (was wahrscheinlich ist 0) ist falsch.

Sie wollen

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

als Bedingung.

+0

"ist wahrscheinlich implementiert". Eigentlich ist ** definitiv ** implementiert. – Bathsheba

+0

@Bathsheba Wenn der Header (und die Enum-Definition) wirklich so geschrieben ist, dann ja. Ich bevorzuge es, es generisch zu halten, wie oben erwähnt, gilt auch, wenn sie verschiedene Werte zugeordnet haben. –

+0

Außer wenn 'enum_1 == 1' natürlich –

Verwandte Themen