编译器不会抱怨语法错误

Compiler doesn't complain about wrong syntax

所以我有这行很棒的代码,但我碰巧打错了:

for(int x=firstKey; x <- runner->numKeys; x++){...}

程序不仅编译顺利,而且链接和运行都没有问题。

当然,for 循环一次也没有 运行。但我无法理解 <- 被解释为什么?这怎么合法?

它是这样解释的:

for(int x = firstKey; x < -runner->numKeys; x++)

空格在 C 语言中几乎无足轻重。例外情况包括您不能在 <=:: 等标记内添加空格。但是token之间的空格一般是允许的,去掉token之间的空格大多数时候也是允许的。

实际上,不是语法错误,它是完全有效语法,语句也是如此:

if (a = 7) doSomething(); // will set a to 7 and call doSomething().
b == 42;                  // won't set b to 42 at all.

您遇到的是语义问题,而不是句法问题。 意思,而不是结构,是不正确的。

表达式:

x <- runner->numKeys

解释为:

x < (-runner->numKeys)

换句话说,只要 x 小于键数的取反,循环就会 运行 。由于键的数量很可能是正的(尽管需要考虑零的边缘情况),否定将是负的,因此如果第一个键是非负的,正文将永远不会是 运行。

无论如何,边缘情况是无关紧要的,因为行为仍然是不正确的,只是方式不同。我正在收集你可能的意思是以下之一:

x <= runner->numKeys
x <  runner->numKeys