不是SO奇怪的C行为

And*_*̷y̷ 1 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;
   }
Run Code Online (Sandbox Code Playgroud)

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

mystrlen.c:12:1: warning: control reaches end of non-void function [-Wreturn-type]
Run Code Online (Sandbox Code Playgroud)

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

unw*_*ind 6

由于for()缺少循环中的分号,因此将return其解析为循环体.

for(i = 0; s[i] !='\0'; i++)
return i;
Run Code Online (Sandbox Code Playgroud)

被解析为

for(i = 0; s[i] !='\0'; i++)
{
  return i;
}
Run Code Online (Sandbox Code Playgroud)

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