我在代码块中编写了一个带有void main函数的c程序。
我只是写回报没有价值 该计划如下:
#include<stdio.h>
void main (void)
{
printf ("ali tariq\n");
return;
}
但是,在控制台窗口中,程序在控制台窗口中返回值16。 “流程返回16”
我想知道它为什么会返回这个值?
如何在Windows中使用代码块来利用这个值?
谢谢
答案 0 :(得分:5)
在(托管)C中,main
函数必须返回int
(C11§5.1.2.2.1[1])。通过使用返回类型void
声明它,并且不指定任何返回值,您可以调用未定义的行为。这意味着编译器可以自由地返回任何内容,在您的情况下,结果是16。
答案 1 :(得分:1)
您不可以随意声明main
的返回类型。为什么呢?
crt0.o
左右。你的main()与该代码相关联,它不能只返回它想要的东西,因为该代码需要int
。总是。它已经编写和编译。你理解这个微妙的观点吗?换句话说,您的代码调用未定义的行为,找到没有提供任何值的垃圾值应该不足为奇。
所以你期望编译器发出警告?更好的确实会用正确的选择来抓住这个。例如。 gcc和clang支持-Wmain-return-type
。
答案 2 :(得分:0)
您不应使用void main()
,而是使用int main()
。
答案 3 :(得分:0)
该程序具有未定义的行为。首先根据C标准主要没有参数应声明为
int main( void )
您将该函数声明为具有返回类型void
。在这种情况下,启动程序的进程无法获得程序的有效返回代码。
答案 4 :(得分:0)
仅仅因为函数被声明为void并不意味着它不会返回任何内容。例如,在x86上,许多调用约定指定函数调用后寄存器EAX
中的值是函数的返回值。因此,如果您有一个声明为void
的C函数,但该函数的机器代码更改了EAX
的值,那么它将被视为该函数的返回值。
答案 5 :(得分:0)
终止执行没有错误的每个“正常”程序,必须返回 ZERO 。
所以,你的程序必须是:
#include<stdio.h>
int main (int argc, char *argv[]) // your program may have command line parameters
{
printf ("ali tariq\n");
return 0; // Program terminate with NO ERRORS
}
但是,有些程序可能会终止 WITH 错误。
我们假设:
#include<stdio.h>
void main (int argc, char *argv[])
{
// program to make a division between two numbers
double a, b, res;
a = b = res = 0.0;
printf ("Enter 1st number: ");
scanf ("%lf", &a);
printf ("Enter 2nd number: ");
scanf ("%lf", &b);
if (b == 0) return 1; // division by '0' then return ERROR (any number != 0)
printf ("%f / %f = %f", a, b, a/b);
return 0; // NO ERROR
}
现在您可能会问:«但是评估的返回值在哪里?
答案:«通过操作系统。»
一个批处理文件可能会运行您的程序并读取环境变量'ERRORLEVEL'中返回的整数