我正在玩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循环之后放置 {}
之后不再有错误。任何人都可以向我解释这种行为吗?
答案 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++;
}