编译器不会抱怨错误的语法

时间:2015-02-10 05:04:48

标签: c compiler-errors compiler-warnings

所以我有这么好的代码,我碰巧有一个错字:

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

该程序不仅顺利编译,而且连接并运行没有问题。

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

2 个答案:

答案 0 :(得分:4)

这是以这种方式解释的:

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

空格在C中几乎无关紧要。例外情况包括您无法在<=::等标记内添加空格。但通常允许令牌之间的空格,并且在大多数情况下也允许删除令牌之间的空格。

答案 1 :(得分:2)

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

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