未签名的函数必须返回一些东西吗?

时间:2018-11-01 18:02:40

标签: c function unsigned

嘿,我正在做一个练习,我必须在C中编写一个无符号函数,并且我有一个问题,由于函数的类型,我是否必须返回一些东西?还是可选的??

2 个答案:

答案 0 :(得分:3)

在正常使用中,任何声明返回值的函数都应返回值。这很大程度上取决于良好的编程习惯。未能返回值通常是错误的征兆。但是,C标准并不需要这样做,并且有两个例外。

C 2018 6.9.1 12允许函数通过在不返回值的情况下到达其代码结尾来终止,前提是调用者不使用该函数的值:

  

除非另有说明,否则,如果到达终止函数的},并且调用者使用了函数调用的值,则行为是不确定的。

在某些情况下函数可能返回值的一种情况是设计为根据命令执行各种不同的动作。例如:

unsigned DoSomething(int command, int parameters[])
{
    switch (command)
    {
        case GetSomething:
            …
            return Something;
        case RememberSomething;
            Something = parameters[0];
            …
            break;
    }
}

此类设计可能容易出错,应仔细考虑。由于已声明该函数返回一个值,因此程序员可能希望它这样做,并且在不返回任何值的情况下无意中将该函数的值分配给另一个对象,从而导致不确定的行为。

另外,一个函数可能根本不返回,并且有一个函数说明符来明确告诉编译器_Noreturn是这样,如6.7.4中所指定。此行为通常仅在异常情况下使用。例如,标准函数abortexit终止程序,因此它们不返回。当然,它们用void声明,因此它们从不返回任何内容。但是,您可能具有在某些情况下调用exit在其他情况下返回整数的函数。

答案 1 :(得分:0)

让所有非void函数返回值是一个好主意,但是如果您退出没有return陈述(即带有}字符)的函数并尝试执行访问其结果,该行为是不确定的。

如果您在Godbolt上探索不同的编译器,并以以下代码作为C源:

int n()
{
    int a = 1234;
}

您会注意到某些编译器根据其警告级别对此行为发出警告。

例如,在int中尝试将结果函数用作printf("%d\n", n());时获得的值是不确定的:无法保证将获得什么值或程序是否会崩溃或完全执行其他操作。

也就是说,根据您要编译的体系结构,您可能从函数中获取局部值作为返回值。例如,在x86体系结构上,几乎每个调用约定都指定函数返回时返回值等于寄存器eax中的值。因此,如果为上面的函数n生成的代码在a中存储了局部变量eax,则“返回值”(quote-unquote)将为1234。 / p>

这不是您应该永远依靠的东西。