2

las ich einige Code und kam über diese eher kryptischen Syntax:c: Was macht diese Linie?

size_t count = 1; 
char *s   = "hello you"; 
char *last_word = "there"; 

count += last_word < (s + strlen(s) - 1); #line of interest 

Count erhöht wird, irgendwie. Aber ich dachte, der <-Operator würde wahr oder falsch zurückgeben. Was macht diese Linie?

+2

'last_word <(n + strlen (en) - 1);' wertet entweder 1 oder 0 (wahr oder falsch) – Linus

+0

siehe [hier] (http://stackoverflow.com/questions/2725044/can -i-nehme an-boltrue-int1-für-irgendeinen-c-compiler) für einige diskussion über casting boolescher zu int –

+0

@EuanSmith wie ist das relevant hier? Relationale Operatoren geben das Ergebnis vom Typ 'int' zurück. Von wo kommt boolean ins Bild? –

Antwort

5

Gemäß der operator precedance Tabelle bindet < höher als += Operator, so dass Ihr Code im Wesentlichen

count += (last_word < (s + strlen(s) - 1)) ; 

ist, wo die (A < B) entweder 0 oder 1 Hinweis wertet, so schließlich reduziert auf

count += 0; 

oder

count += 1; 

Hinweis: im Zusammenhang mit dem "1 oder 0" Teil unter Angabe C11, Kapitel §6.5.8/p6, Relationale Operatoren

Jeder des Betreibers < (weniger als), > (größer als), <= (kleiner oder gleich) und >= (größer oder gleich) sollen 1 ergeben, wenn die angegebene Relation true und 0 ist, wenn dies der Fall ist false. 107) Das Ergebnis hat den Typ int.

0

In C gibt es eine der stdbool.h Header, die als wahr und falsch definiert. Im Wesentlichen können Sie den Grund UMSETZEN denken als:

#define bool int 
#define true 1 
#define false 0 

true und false definiert werden als nicht Null und gleich Null ist. Also im Grunde, wenn last_word < (s + strlen(s) - 1), zählt um eins erhöht wird.

+0

Überraschung !! C hat Boolean. –

+0

@SouravGhosh meinst du den 'stdbool' Header? – Linus

+0

Ja, absolut. :) –

1

In C relationalen Operatoren ergeben immer 0 oder 1. So, diese Aussage

count += last_word < (s + strlen(s) - 1); 

entweder 0 oder 1-count je nach dem Ergebnis des Vergleichs hinzufügt. Es kann als (und äquivalent) geschrieben werden:

if (last_word < (s + strlen(s) - 1)) { 
    count = count + 1; 
} else { 
    count = count + 0; 
} 

(. Der else Teil ist unnötig, hinzugefügt für Erklärungszwecke)

C11 (Entwurf N1548.pdf), Vergleichsoperatoren, § 6.5.8, 6

Jeder der Operatoren < (weniger als),> (größer als), < = (kleine oder gleich) und> = (größer oder gleich) wird 1 ergeben wenn die angegebene Beziehung wahr ist und 0, wenn sie falsch ist. 107) Das Ergebnis hat Typ int.