preprocessor works like C++ in this sense.
if 1 means if(true) means the if statement executes.
that means the else won't execute.
usually its
#if symbol
statements
#else
statements
#endif //required because {} does not work in preprocessor.
what this is used for, most of the time, is to help set up different build options when you compile the code, for example you may have if windows include windows.h else include unixstd.h or something like that, to compile on windows or unix, respectively. Here, instead of like in code, the statements in the blocks are compiled or not compiled depending on the condition.
if 1 and if 0 are usually temporary to debug by removing a block of code, same as /**/ wrapper around it, but useful if the code in question HAS comment blocks inside it already. You don't normally KEEP the 0/1 macros after debugging the code, they are a temporary tool for use during development and debugging etc.
you may also see #ifdef -- this checks the *existence* of the symbol instead of its value.
/* */ style comments cannot be nested, so it's harder to comment out huge swaths of code if there are already /**/ comments in them (of course, with IDEs these days, this is less than an issue, but sometimes you might just want to edit something quickly in a text editor).
Using #if 0 as a comment allows for nesting, so you can have an #if 0 within another #if 0.
It allows you to just toggle something easily that a dev is working on. Change the 1 to a 0 to trigger the "other statements". This is more of an ad hoc thing when you're using literal 1s or 0s.
It becomes more useful when you inject macros from the command-line or from other files.
So you can do something like: