zhilenkov Asked:2022-01-26 11:04:27 +0000 UTC2022-01-26 11:04:27 +0000 UTC 2022-01-26 11:04:27 +0000 UTC 如何从 C 函数返回不同类型的“int、float”变量? 772 我有一个函数'popStack',它应该根据浮点或整数的类型返回。 float popStack(void); int popStack(void); int - 4 个字节;浮动 - 4 个字节; c 3 个回答 Voted Best Answer Sergey 2022-01-26T12:01:58Z2022-01-26T12:01:58Z 查看 C 语言标准,它在第 6.7.1 节中说(工作草案,1997-11-21,WG14/N794 J11/97-158): 3 函数的返回类型应为 void 或数组类型以外的对象类型。 那些。您可以返回除数组之外的任何类型。但是,其实这并没有多大意义,因为。您可以返回除一种类型以外的任何类型的值。 好吧,这里有一个例子: #include <stdio.h> typedef union { float x; int n; } flint; flint z; flint popStack(void) { return z; } int main(int argc, char *argv[]) { int j; float r; flint fl; z.x = 25.5; fl = popStack(); printf("%6.2f\n", fl.x); z.n = 25; fl = popStack(); printf("%6d\n", fl.n); } 该程序的输出将是: $ ./a.out 25.50 25 似乎是——是的,一个整数值和一个浮点值都被返回了……但反正用起来不方便——不方便! user206435 2022-01-26T12:14:07Z2022-01-26T12:14:07Z 类似于伪重载的东西,但您仍然需要传递c11参数: #include <stdio.h> float popStack_f(void) { return 1.0f; } int popStack_i(void) { return 6; } #define popStack(X) _Generic((X), \ int: popStack_i, \ float: popStack_f)() int main(void) { printf("%d\n", popStack((int)0)); printf("%f\n", popStack((float)0)); return 0; } https://ideone.com/kdMyhE 6 1.000000 AlexGlebe 2022-01-26T15:06:35Z2022-01-26T15:06:35Z 返回值必须是相同的类型。但如果你愿意,你可以做一个虚拟号码类。 // gcc -Wall -Wextra -Wpedantic -std=c11 virtualplus.c -o virtualplus enum { virtualNumberInt = 0 , virtualNumberFloat = 1 } ; typedef struct virtualNumber { int type ; union { int i ; float f ; } ; } virtualNumber ; # include <setjmp.h> jmp_buf jbexception ; virtualNumber plus (virtualNumber x,virtualNumber y){ switch(x.type){ case virtualNumberInt : switch(y.type){ case virtualNumberInt : return (virtualNumber){ .type = virtualNumberInt , .i = x.i + y.i } ; case virtualNumberFloat : return (virtualNumber){ .type = virtualNumberFloat , .f = x.i + y.f } ; default : longjmp(jbexception,1); } case virtualNumberFloat : switch(y.type){ case virtualNumberInt : return (virtualNumber){ .type = virtualNumberInt , .f = x.f + y.i } ; case virtualNumberFloat : return (virtualNumber){ .type = virtualNumberFloat , .f = x.f + y.f } ; default : longjmp(jbexception,1); } default : longjmp(jbexception,1); } } #include <stdio.h> #include <stdlib.h> int main(){ if(setjmp(jbexception)) { fputs("exception: wrong number type",stderr); exit(1); } virtualNumber x = {.type = virtualNumberInt , .i = 1}; virtualNumber y = {.type = virtualNumberFloat , .f = 1.0}; virtualNumber z = plus(x,y); switch(z.type){ case virtualNumberInt : printf("z(int)=%d\n",z.i); break; case virtualNumberFloat : printf("z(float)=%f\n",z.f); break; default : longjmp(jbexception,1); } } 考试 : $ ./virtualplus z(float)=2.000000
查看 C 语言标准,它在第 6.7.1 节中说(工作草案,1997-11-21,WG14/N794 J11/97-158):
那些。您可以返回除数组之外的任何类型。但是,其实这并没有多大意义,因为。您可以返回除一种类型以外的任何类型的值。
好吧,这里有一个例子:
该程序的输出将是:
似乎是——是的,一个整数值和一个浮点值都被返回了……但反正用起来不方便——不方便!
类似于伪重载的东西,但您仍然需要传递c11参数:
https://ideone.com/kdMyhE
返回值必须是相同的类型。但如果你愿意,你可以做一个虚拟号码类。
考试 :