[C++] Porównanie dyrektywy if i instrukcji if

Witam!

Chciałbym się dowiedzieć czy dobrze rozumiem zasadnicze różnice pomiędzy dyrektywą, a instrukcją if. Napisałem kilka przykładowych pseudokodów, ale oczywiście poza forum testowałem to na prawdziwym kodzie. Po prostu odpiszcie czy wszystko się zgadza :wink:

Instrukcja if:

:arrow: Do wyboru dwu-wariantowego służy instrukcja:

if(warunek)

isntrukcja;

else

:arrow: Warunek musi być podany w nawiasie :arrow: Jeśli nawiasy klamrowe nie stanowią inaczej to else odnosi się do najbliższego poprzedzającego go if lub else if :arrow: Jeżeli warunek przy if będzie spełniony, a if (lub też else if) nie będzie miał nawiasów klamrowych to zostanie wykonana tylko pierwsza instrukcja. Tzn. jeżeli tutaj warunek się nie będzie zgadzał to i tak zostaną wykonane instr. 2 i instr. 3 :

if(10 == 2)

instrukcja_1;

instrukcja_2;

instrukcja_3;

Tak się dzieje tylko wtedy, jeżeli po if nie ma else lub else if. :arrow: Jako warunek może być podana zamiast stałej dosłownej - zmienna :arrow: Przy else nie może być warunku - nawet prawdziwego. Tzn. tutaj będzie błąd:

if (false)                      

cout << "BLAD!"; 

else (true)

cout << "OK";

--------------------------------------------------------------------------------------------------------------------- Dyrektywa #if: :arrow: Warunek nie musi być podany w nawiasie :arrow: ZAWSZE takie dyrektywy muszą mieć zakończenie - #endif :arrow: Jako warunek zawsze musi wystąpić stała dosłowna (- czyli coś co preprocesor już zna przed kompilacją) :arrow: W przeciwieństwie do “zwykłego” if , tutaj może być warunek prawdziwy przy #else:

#if 10 == 5

cout << "BLAD!"; 	

#else 10 == 10

cout << "OK";

#endif

Ale to już należy traktować jako bardzo zaawansowaną ciekawostkę…

:arrow: Zamiast #elif możemy użyć dłuższej formy #else if

:arrow: #ifdef możemy zastąpić #if defined

:arrow: Ale już nie możemy np. #ifndef zastąpić #if not defined

Co prawda niektóre zdania są zbyt szczegółowe, ale interesuje mnie czy zawsze tak jest :slight_smile:

Podstawowa różnica między dyrektywą if a instrukcją if jest taka że dyrektywa jest “instrukcją” dla kompilatora, tzn. zostaną skompilowane tylko te fragmenty kodu które spełniają warunki dyrektywy.

Pozdrawiam

Ściślej preprocesora.

Ale sam pomysł porównywania tego… :expressionless: