2013-09-05 11 views
10

C ma następującą składnię skrót IF-ELSEIF-ELSE skrót w języku C

(integer == 5) ? (TRUE) : (FALSE); 

często znajduję się wymaga tylko jednej części (PRAWDA lub FAŁSZ) zestawienia i wykorzystać tę

(integer == 5) ? (TRUE) : (0); 

Zastanawiam się, czy istnieje sposób, aby nie uwzględnić części ELSE w oświadczeniu, używając tej skróconej notacji?

+0

To na pewno działa w C i kompiluje używając gcc. – sherrellbc

+2

Instrukcja "return" z pewnością nie może być umieszczona wewnątrz wyrażenia. – duskwuff

+0

Okay, właśnie napisałem to jako przykład. Składnia jest poprawna, moja przykładowa implementacja była błędna; to nie jest kwestia tego pytania. Mimo wszystko dziekuję. – sherrellbc

Odpowiedz

11

Operator musi odebrać wartość przez operatora ?:. Gdybyś nie miał części "else", co by zwrócił, gdy wyrażenie boolowskie jest fałszywe? Rozsądne ustawienie domyślne w niektórych innych językach może mieć wartość null, ale prawdopodobnie nie dla C. Jeśli potrzebujesz tylko "jeśli" i nie potrzebujesz go, aby zwrócić wartość, to wpisanie if jest dużo łatwiejsze.

+0

Dzięki! To wszystko, o co prosiłem. Zastanawiałem się tylko, czy istnieje sposób, aby nie wdrożyć żadnej z tych części, jeśli wszystko, na czym ci zależy, to sytuacja, w której warunek jest oceniany w określony sposób, w przeciwnym razie nie rób nic. Chociaż, przypuszczam, że ma to sens w przypadku przypisania przy użyciu tego stwierdzenia. Jeśli przypadek był fałszywy, nie byłoby zdefiniowanego przypisania. – sherrellbc

+0

gcc pozwala na pewien specjalny przypadek, ale jest to niestandardowe rozszerzenie. Na przykład. 'retval = retval?: desc.error;' - patrz http://stackoverflow.com/questions/7814694/bizarre-use-of-conditional-operator-in-linux –

+0

@PaulR Pamiętam, że gdzieś to czytałem, ale nigdy spojrzał na to. To nie wydaje się być przydatne. – Jeremy

1

Pytanie brzmi, czy możemy jakoś napisać następujące wyrażenie bez zarówno wtedy i else części

(integer == 5) ? (THENEXPR) : (ELSEEXPR); 

Jeśli potrzebujesz tylko wówczas częścią można użyć & &:

(integer == 5) && (THENEXPR) 

Jeśli y ou trzeba tylko część użycie innego ||:

(integer == 5) || (ELSEEXPR) 
+0

Dla tych ostatnich musi być jasne, że nie zostanie wykonane żadne zadanie dla "innego przypadku". W moim przypadku szukałem, czy można skrócić 'int number = 0; liczba całkowita = 2; liczba = (liczba całkowita == 5)?(następnie zresetuj): (zachowaj cokolwiek) '. Ale 'liczba' pozostaje 0. – CanO

+0

Jeśli jest osadzony jako prawidłowa wartość przypisania, to przypisanie musi nastąpić, a więc" inny przypadek "wyrażenia ocenia i przypisuje wartość warunku skrótu: 1 dla || i do 0 dla &&. Jako "skróconą instrukcję IF-ELSE" (zapytanie OP) wartość zostanie odrzucona, a przypisanie powinno być częścią części wtedy i/lub innej (w zależności od tego, która z tych wartości istnieje). Alternatywnie możesz użyć n = (i == 5)? 0: n, ale dlaczego nie wystarczy powiedzieć, czy (i == 5) n = 0; co jest miłe i krótkie (krótsze - nawet z pojedynczym char var). –