C中函数中的void与int
只是一个初级问题。在函数中使用int()而不是void()有区别吗?我知道,如果没有返回值,就使用void,但是使用int而不是void会弄糟还是会给出不同的输出?比如:C中函数中的void与int,c,C,只是一个初级问题。在函数中使用int()而不是void()有区别吗?我知道,如果没有返回值,就使用void,但是使用int而不是void会弄糟还是会给出不同的输出?比如: { sample(); return 0; } int sample() { print("example"); } 而不是 { sample(); return 0; } void sample() { print("example"); } 编辑:为那些愚
{
sample();
return 0;
}
int sample()
{
print("example");
}
而不是
{
sample();
return 0;
}
void sample()
{
print("example");
}
编辑:为那些愚蠢的例子道歉。。我还是个学生
是的,有区别;实际上有好几个
int
用于这两个函数将是无用的,令人困惑,并建议使用不同的函数,如图所示。因此,只有void
是一种不会让所有必须阅读您的代码的人感到困惑的方式int
确实有意义(因为函数的代码与所示代码不同),那么返回的值将被忽略,对于那些返回函数变量的值来说,这很可能是一个问题#include <stdio.h>
int sample()
{
printf("example");
}
int main(int argc, char *argv[])
{
sample();
return 0;
}
我得到了以下结果:
basicq.c:6:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
1 warning generated.
这只是一个衰减,不是一个错误,所以程序确实编译并运行了。在这种情况下它是有效的,因为在非常简单的代码中,实际上没有使用应该返回的值,所以没有出现任何问题。但如果你真的尝试使用它,会发生什么?让我们看看。。。我将更改main()
如下:
#include <stdio.h>
int sample()
{
printf("example");
}
int main(int argc, char *argv[])
{
int i = sample();
printf("%d\n", i);
return 0;
}
第一部分“示例”来自sample()
,而0
来自main()
中的printf()
。为什么是零
调用函数时,堆栈上会为返回值保留一些空间。被调用函数中的return
语句通常用函数想要返回的任何值填充该空间。如果函数无法执行return
语句,那么该空间仍然存在,调用方仍然可以读取,但无法知道其中可能包含什么。。。没有定义。这就是为什么你会收到警告。。。编译器告诉你“嘿,你说过你要返回一个值,但是你从来没有这样做过。”但是它仍然允许你这样做,因为C给了你能力去做各种实际上不是好主意的事情
让我们换一种方式来尝试,既从void函数返回值,也从返回void
的函数获取值:
#include <stdio.h>
void sample()
{
printf("example");
return 1;
}
int main(int argc, char *argv[])
{
int i = sample();
printf("%d\n", i);
return 0;
}
这是因为
void
返回类型告诉编译器没有返回任何内容,因此没有为返回值保留空间,尝试写入或读取不存在的空间没有任何意义。。。编译器不知道如何生成该代码,因此在这两种情况下都会生成错误。这实际上取决于编译器及其功能。它可能导致未定义的行为。如果您有一个不返回值的函数,那么就不要这样声明它(将返回类型声明为void
)。一般来说,不要编写没有意义的代码。一个好的编译器在第一个示例中会给你警告,在第二个示例中不会给你警告(假设第一部分实际上是main
)void sample()
是正确的,int sample()
不是,这是主要的区别。假设在您省略了名称的神秘函数之前,sample
没有原型,一个好的编译器会在这两个方面向您发出警告,在第二个方面则会出现错误。第一个将警告您sample
未声明,并假设返回int
(确实如此,但编译器还不知道),然后再次警告您,因为sample
缺少返回。第二个警告与第一个问题相同,但随后出现错误,因为编译之前的代码时,void sample()
不再符合int sample()
的隐式外部假设。我错过了你的第一个问题,这一点很好。但是,您确定这是编译器错误吗?我认为这是一个警告。@Yunnosch这不是一个编译器错误;这充其量只是一个警告,如果一个人明智地启用将所有警告视为其构建中的错误,那么它可能会成为一个错误(这是一条明智的建议,适用于所有人,无论是新的还是旧的,C)。@WhozCraig说得不错。我会接受“应该是错误的”,但我认为答案中应该明确。@Yunnosch我同意。老实说,如果没有一个合适的原型,我们甚至不知道OP是否有一个合适的原型,一个格式良好的main
,等等。所以我们都在这里。因此,为什么我的评估是在一般性评论中。我的错误,正如在另一个评论中提到的,不会有编译错误。
example0
#include <stdio.h>
void sample()
{
printf("example");
return 1;
}
int main(int argc, char *argv[])
{
int i = sample();
printf("%d\n", i);
return 0;
}
basicq.c:6:3: error: void function 'sample' should not return a value
[-Wreturn-type]
return 1;
^ ~
basicq.c:11:7: error: initializing 'int' with an expression of incompatible type
'void'
int i = sample();
^ ~~~~~~~~
2 errors generated.