I've seen the condition syntax as follows, shown a lot in example code to check if an integral value y is between two bounds x and z:
if (x <= y <= z) { //... }
I thought I'd used this before myself, but in a small piece of code Im running a test on, the condition always evaluates to true... Doubting my own memory here now because I'm near sure I've used it before! Is the syntax allowable in ISO C? Am I just expecting it to do something it's not meant to do?
The old fashioned:
if (x >= y && x <= z) { //... }
still works a charm so I haven't quite made it to the doddering stage of recall just yet ;)
I guess that all x, y, z are some integral type like int or long. For floating point notice that NaN != NaN.....
The first if (x <= y <= z) is wrong. It is parsed as if ((x<=y) <= z). A compare returns a boolean value, which, when used in some integral context, is promoted to 0 (for false) or 1 (for true). So when x <= y the test behave as if (1 <= z) and when on the contrary x > y the test is equivalent to if (0 <= z)
When asked to give all warnings (e.g. gcc -Wall) a good compiler (such as GCC) would warn you.
Is the syntax allowable in ISO C?
Read also Modern C and this C reference and the documentation of your C compiler. Study, for inspiration, the source code of existing open source software (e.g. on github or gitlab). You are unlikely to see code such as if (x <= y <= z). That syntax is allowable, but weird.
BTW, in the unlikely case -I never meet that, but I do code in C since 1980s- you really mean if ((x<=y) <= z) I feel that the code is bizarre enough to need an explicit comment, or code if (((x<=y)?1:0) <= z)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With