Arytmetyka liczb całkowitych? Uruchom następujący program, aby dowiedzieć się:
#include "stdio.h"
int main() {
#if 1 + 1 == 2
printf("1+1==2\n");
#endif
#if 1 + 1 == 3
printf("1+1==3\n");
#endif
}
odpowiedź brzmi „tak”, nie ma sposobu, aby preprocesor wykonać arytmetyki liczb całkowitych, która jest wykorzystanie go w stanie preprocesora.
Pamiętaj jednak, że Twoje przykłady nie są arytmetyczne. Właśnie sprawdziłem i preprocesor gcc nie powiedzie się, jeśli spróbujesz dokonać porównania float. Nie sprawdziłem, czy standard pozwala na arytmetykę zmiennoprzecinkową w preprocesorze.
Regularne makro ekspansja nie ocenia wyrażeń całkowitych, pozostawia go do kompilatora, jak widać przez przerób (-E w gcc) następujące:
#define ONEPLUSONE (1 + 1)
#if ONEPLUSONE == 2
int i = ONEPLUSONE;
#endif
wynik jest int i = (1 + 1);
(plus prawdopodobnie niektóre rzeczy w celu wskazania nazw plików źródłowych i numerów linii itp.).
PI jest liczbą całkowitą z przykładu; zatem OP ani OP2 nie będą liczbami całkowitymi, jeśli preprocesor był zmuszony je ocenić. A operandy "%" nie mogą być liczbami zmiennoprzecinkowymi. –