不是SO奇怪的C行为

时间:2014-03-17 09:57:03

标签: c loops for-loop

我正在玩C,并决定建立我自己的strlen()功能而且我做了。但是通过这样做,我很震惊地发现{}可以做什么。这是我的代码:

#include <stdio.h>
#include <assert.h>

int mystrlen(char *s)
{
    int i = 0;
    assert(s[0] !='\0');

    for(i = 0; s[i] !='\0'; i++)
    // Placing {} here causes the error to disappear //
    return i;
}

int main(void)
{
    char hello[] = "hello";
    int len = mystrlen(hello);
    printf("Length = %d\n", len);

    return 0;
   }

运行此代码会产生此错误:

mystrlen.c:12:1: warning: control reaches end of non-void function [-Wreturn-type]

但在while循环之后放置 {}之后不再有错误。任何人都可以向我解释这种行为吗?

3 个答案:

答案 0 :(得分:6)

由于缺少for()循环中的分号,return被解析为循环体。

for(i = 0; s[i] !='\0'; i++)
return i;

被解析为

for(i = 0; s[i] !='\0'; i++)
{
  return i;
}

这意味着在循环之后,函数结束时没有return。以大括号的形式添加空语句会使for循环具有空主体,从而将return移动到循环外部。

答案 1 :(得分:4)

因为您缺少分号:

for(i = 0; s[i] !='\0'; i++)     ; //<--

答案 2 :(得分:0)

为了防止出现这样的错误,我总是写大括号

for(i = 0; s[i] !='\0'; i++)
{ /* increment i */ }

另请注意:

for ( <expression1> ; <expression2> ; <expression3> ) <statement>

等于:

<expression1>;
while (<expression2>)
{
   <statement>
   <expression3>;
}

所以更明确一点,你也可以写:

i = 0;
while (s[i] !='\0')
{
   i++;
}