Why are empty expressions legal in C/C++?

后端 未结 11 1738
囚心锁ツ
囚心锁ツ 2020-11-29 11:21
int main()
{
  int var = 0;; // Typo which compiles just fine
}
相关标签:
11条回答
  • 2020-11-29 11:44

    Obviously, it is so that we can say things like

    for (;;) {
      // stuff
    }
    

    Who could live without that?

    0 讨论(0)
  • 2020-11-29 11:52

    You want to be able to do things like

    while (fnorble(the_smurf) == FAILED)
        ;
    

    and not

    while (fnorble(the_smurf) == FAILED)
        do_nothing_just_because_you_have_to_write_something_here();
    

    But! Please do not write the empty statement on the same line, like this:

    while (fnorble(the_smurf) == FAILED);
    

    That’s a very good way to confuse the reader, since it is easy to miss the semicolon, and therefore think that the next row is the body of the loop. Remember: Programming is really about communication — not with the compiler, but with other people, who will read your code. (Or with yourself, three years later!)

    0 讨论(0)
  • 2020-11-29 11:57

    This is the way C and C++ express NOP.

    0 讨论(0)
  • 2020-11-29 11:57

    How else could assert(foo == bar); compile down to nothing when NDEBUG is defined?

    0 讨论(0)
  • 2020-11-29 11:57

    I'm no language designer, but the answer I'd give is "why not?" From the language design perspective, one wants the rules (i.e. the grammar) to be as simple as possible.

    Not to mention that "empty expressions" have uses, i.e.

    for (i = 0; i < INSANE_NUMBER; i++);

    Will dead-wait (not a good use, but a use nonetheless).

    EDIT: As pointed out in a comment to this answer, any compiler worth its salt would probably not busy wait at this loop, and optimize it away. However, if there were something more useful in the for head itself (other than i++), which I've seen done (strangely) with data structure traversal, then I imagine you could still construct a loop with an empty body (by using/abusing the "for" construct).

    0 讨论(0)
提交回复
热议问题