@jgroch:
Trafiłeś na bardzo upierdliwą cechę C/C++ : kompatybilność każdego dowolnego wyrażenia z typem boolowskim, (pozornie) wymaganym przez if
W jezykach jak C# czy Java by dało błedy kompilacji, bo żaden operator w stylu ||
nie przyjmie bool z jednej strony, a stringa z drugiej.
Stara cecha C z lata 1970ch, miało chodzić o oszczędnośći 1-2 rozkazów maszynowych - co dawno nie jest prawdą, podlega to optymalizacji. Tragiocznie zdecydowano w C++, ze ma być z C kompatybilne
To się w C/C++ czyta
str=="Kot"
// czy jest kot, wyr logiczne, na razie ok.
||
"Ala ma kota"
// wskaznik na string, skoro wskażnik jest nie-null -> true