编译器不会抱怨语法错误
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
所以我有这行很棒的代码,但我碰巧打错了:
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