无符号函数必须 return 什么东西吗??
Do unsigned functions has to return something??
嘿,我正在做一个练习,我必须在 C 中编写一个无符号函数,我有一个问题,我是否必须 return 因为函数的类型?还是可选的??
在正常使用中,任何声明为 return 值的函数都应该 return 值。这在很大程度上是良好编程习惯的问题。未能 return 一个值通常是错误的标志。然而,这不是C标准所要求的,并且有两个例外。
C 2018 6.9.1 12 允许函数在没有 returning 值的情况下到达其代码末尾而终止,前提是调用者不使用函数的值:
Unless otherwise specified, if the }
that terminates a function is reached, and the value of the function call is used by the caller, the behavior is undefined.
一个函数在某些情况下可能 return 值而在其他情况下不是的情况是它被设计为根据命令执行各种不同的操作。例如:
unsigned DoSomething(int command, int parameters[])
{
switch (command)
{
case GetSomething:
…
return Something;
case RememberSomething;
Something = parameters[0];
…
break;
}
}
这样的设计可能容易出错,应该慎重考虑。由于函数被声明为 return 一个值,程序员可能会期望它这样做,并且在没有值被 returned 的情况下无意中将函数的值分配给另一个对象,从而导致未定义行为。
此外,一个函数可能根本就不是 return,并且有一个函数说明符用于明确告诉编译器这是如此,_Noreturn
,如 6.7.4 中所指定的。此行为通常仅在异常情况下使用。例如,标准函数 abort
和 exit
终止程序,因此它们不会 return。当然,它们是用 void
声明的,所以它们从来没有 return 任何东西。但是,您可能有一个函数在某些情况下调用 exit
,而在其他情况下 return 是一个整数。
让所有非 void
函数 return 是个好主意,但是如果你在没有 return
语句的情况下退出函数(即使用 }
字符)并尝试访问其结果,行为未定义。
如果您在 Godbolt 上探索不同的编译器,使用以下代码作为 C 源代码:
int n()
{
int a = 1234;
}
您会注意到某些编译器会根据其警告级别对此行为发出警告。
如果您尝试将结果函数用作 int
,例如,在 printf("%d\n", n());
中,您获得的值是未定义的:无法保证您将获得什么值,或者您的程序会崩溃,或者完全做其他事情。
也就是说,根据您正在编译的体系结构,您可能 从您的函数中获取本地值作为 return 值。例如,在 x86 架构上,几乎每个调用约定都指定 return 值是函数 return 时寄存器 eax
中的任何值。因此,如果上面函数 n
的生成代码将局部变量 a
存储在 eax
中,则 "return value"(引号-反引号)将是 1234
。
不过,这不是您应该永远依赖的东西。
嘿,我正在做一个练习,我必须在 C 中编写一个无符号函数,我有一个问题,我是否必须 return 因为函数的类型?还是可选的??
在正常使用中,任何声明为 return 值的函数都应该 return 值。这在很大程度上是良好编程习惯的问题。未能 return 一个值通常是错误的标志。然而,这不是C标准所要求的,并且有两个例外。
C 2018 6.9.1 12 允许函数在没有 returning 值的情况下到达其代码末尾而终止,前提是调用者不使用函数的值:
Unless otherwise specified, if the
}
that terminates a function is reached, and the value of the function call is used by the caller, the behavior is undefined.
一个函数在某些情况下可能 return 值而在其他情况下不是的情况是它被设计为根据命令执行各种不同的操作。例如:
unsigned DoSomething(int command, int parameters[])
{
switch (command)
{
case GetSomething:
…
return Something;
case RememberSomething;
Something = parameters[0];
…
break;
}
}
这样的设计可能容易出错,应该慎重考虑。由于函数被声明为 return 一个值,程序员可能会期望它这样做,并且在没有值被 returned 的情况下无意中将函数的值分配给另一个对象,从而导致未定义行为。
此外,一个函数可能根本就不是 return,并且有一个函数说明符用于明确告诉编译器这是如此,_Noreturn
,如 6.7.4 中所指定的。此行为通常仅在异常情况下使用。例如,标准函数 abort
和 exit
终止程序,因此它们不会 return。当然,它们是用 void
声明的,所以它们从来没有 return 任何东西。但是,您可能有一个函数在某些情况下调用 exit
,而在其他情况下 return 是一个整数。
让所有非 void
函数 return 是个好主意,但是如果你在没有 return
语句的情况下退出函数(即使用 }
字符)并尝试访问其结果,行为未定义。
如果您在 Godbolt 上探索不同的编译器,使用以下代码作为 C 源代码:
int n()
{
int a = 1234;
}
您会注意到某些编译器会根据其警告级别对此行为发出警告。
如果您尝试将结果函数用作 int
,例如,在 printf("%d\n", n());
中,您获得的值是未定义的:无法保证您将获得什么值,或者您的程序会崩溃,或者完全做其他事情。
也就是说,根据您正在编译的体系结构,您可能 从您的函数中获取本地值作为 return 值。例如,在 x86 架构上,几乎每个调用约定都指定 return 值是函数 return 时寄存器 eax
中的任何值。因此,如果上面函数 n
的生成代码将局部变量 a
存储在 eax
中,则 "return value"(引号-反引号)将是 1234
。
不过,这不是您应该永远依赖的东西。