Expression in preprocessor directives
An expression used by a preprocessor directive #if
is parsed by the preprocessor to retrieve a boolean value.
For example:
#if ((2+X)>=7) and (Y<0))
is a preprocessor directive with expression to resolve by the preprocessor.
To resolves that expression, preprocessor makes operation on the values,
converts them, applies an operators of arithmetic instructions, and so on,
to finally receive a single boolean value, which will be used in a directive.
Values and operators used in the syntax of this expression are decribed below.
For more about directives see Language text preprocessor.
Values and types
There are allowed three kinds of the data type: boolean, integer and string.
A type of the value is automatically detected by the expression parser.
There are two values of boolean type: true and false,
and they can be written: true, TRUE, True, false, FALSE, False .
An integer type value is a 64bit integer number with sign.
Notation allows decimal, hexadecimal and binary form.
Examples: 0, 17, 234, 0X4f5a, 0xFEDCBA0, 0b110010 .
There are no floating point numbers, nor any others.
A string type object is a text inserted between quotation marks:
" ... " or single quotes: ' ... ' .
Example: "Hello!" .
Operations
List of the allowed operations in the preprocessor expression:
operator 
syntax 
meaning 
++ 
++x, x++ 
x+1 
 
x, x 
x1 
! 
!x 
logical not x 
+ 
a + b 
sum 
 
a  b 
difference 
* 
a * b 
product 
/ 
a / b 
quotient 
% 
a % b 
modulo 
== 
a == b 
is equal 
!= 
a != b 
is not equal 
<> 
a <> b 
is not equal 
< 
a < b 
is less than 
> 
a > b 
is greater than 
<= 
a <= b 
is less than or equal to 
>= 
a >= b 
is greater than or equal to 
&& 
a && b 
logical and 
 
a  b 
logical or 
& 
a & b 
bitwise and 
 
a  b 
bitwise or 
^ 
a ^ b 
bitwise xor 
~ 
~a 
bitwise not 
<< 
a << b 
bitwise left shift 
>> 
a >> b 
bitwise right shift 
?: 
a ? b : c 
ternary conditional 
Priority of operators
priority level 
operator or statement 
selecting from 
0 
brackets (...) 
left 
1 
a++, a 
left 
2 
!a, ++a,
a, ~a 
right 
3 
* / % 
left 
4 
+  
left 
5 
<< >> 
left 
6 
< <= > >= 
left 
7 
== != <> 
left 
8 
& 
left 
9 
^ 
left 
10 
 
left 
11 
&& 
left 
12 
 
left 
13 
a ? b : c 
left 
Column "selecting from" says if the expression statement is interpreted from lefttoright or from righttoleft.
Type conversion
A data values are converted to expected type, that depends on the first argument of the operator.
For example:
2 + "3" > 5
"2" + 3 > "23"
And finally, value of whole expression is converted to the boolean value.

