gpt4 book ai didi

c++ - 具有 double 类型的可变数字参数的函数的奇怪输出

转载 作者:太空宇宙 更新时间:2023-11-04 01:57:12 28 4
gpt4 key购买 nike

我尝试了具有可变数量整数参数的函数,它按预期工作。但是当我尝试可变数量的“double”类型的参数时,它给出了奇怪的输出:

$ g++ -fpermissive -std=c++11 te2d.cc
te2d.cc: In function ‘void maxof(double, long int, ...)’:
te2d.cc:19:16: warning: return-statement with a value, in function returning 'void' [-fpermissive]
$ ./a.out
dum=100.200000
debug 1 0.000000
debug 2 0.000000
debug 3 -5486124068793688683255936251187209270074392635932332070112001988456197381759672947165175699536362793613284725337872111744958183862744647903224103718245670299614498700710006264535590197791934024641512541262359795191593953928908168990292758500391456212260452596575509589842140073806143686060649302051520512.000000
debug 4 0.000000

这是简短的代码:

#include <stdio.h>
#include <stdarg.h>
typedef unsigned char uchar;
typedef unsigned short uint16;
using namespace std;
typedef unsigned char uchar;
void maxof(double dum, long n_args, ...){
printf("dum=%f\n", dum);
register int i;
int max = 0;
va_list ap;

va_start(ap, n_args);
for(i = 1; i <= n_args; i++) {
printf("debug %d %f\n", i, va_arg(ap, double));
}

va_end(ap);
return max;
}

int main(int argc, char *argv[]) {
maxof(100.2, 4, 10,14,13,11);
return 0;
}

有什么想法吗?谢谢。

最佳答案

C 可变参数函数不会神奇地处理来自 int 的转换至 double *。您需要指定进入函数的类型,而不是您希望在转换后结束的类型。将其视为告诉编译器如何与堆栈交互。如果你告诉它栈顶有一个 doubledouble大于int ,你现在只是告诉它从堆栈中取出额外的字节,这很糟糕。即使它们的大小相同,它们的二进制表示也不相同。

您确实必须小心使用 C 可变参数函数。更好的解决方案(如果可用)是使用可变参数模板,它是完全类型安全的并且会触发编译时 错误,而不是未定义的行为。在这种情况下,由于您希望所有参数都是同一类型,因此可以使用 std::initializer_list :

#include <initializer_list> //be sure not to forget this when using std::initializer_list

double maxof(std::initializer_list<double> nums) {
double max = 0; //hope you don't have negative numbers
for (const auto &num : nums) {
if (num > max) {max = num;}
}

return max;
}

...

maxof({10,14,13,11})

请注意,std::max 过载了就是这样做的,所以不需要自己写。

如果您坚持使用 C++11 之前的版本,您可能会创建许多重载以获得相同的效果,但您最好创建一个基于容器或迭代器的函数,例如 std::max_element .


*促销应用于参数,因此它并不总是输入的确切类型。例如,传递一个 char将需要提取 int 的函数.这些促销事件是明确的,主要是 <small integral type> -> int .

关于c++ - 具有 double 类型的可变数字参数的函数的奇怪输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32663728/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com