我有疑问:这两个声明有什么区别?
public static void printMax(double... numbers) { ... }
public static void printmax(double numbers[]) { ... }
Run Code Online (Sandbox Code Playgroud)
是double... numbers一样的double numbers[]吗?
我想知道我怎么能做到这一点.我对N个论点部分感到困惑:
printf("Hello, I'm %i years old and my mom is %i .",me.age(),mom.age());
Run Code Online (Sandbox Code Playgroud)
我想创建一个函数,它将采用这样的格式化字符串并返回一个std字符串.
N个参数部分是如何完成的?
为什么下面的代码给出了EXC_BAD_ACCESS, could not access memory?
int combine_strings(char **outputStr,...)
{
va_list ap;
char *s, *out=0;
int len=0;
va_start(ap,outputStr);
while(s=va_arg(ap,char *))
{
len+=strlen(s);
}
va_end(ap);
if(!(out=malloc(len+1)))
exit(1);
*outputStr=out;
va_start(ap,outputStr);
while(s=va_arg(ap,char *))
{
len=strlen(s);
memcpy(out,s,len);
out+=len;
}
va_end(ap);
*out=0;
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我注意到va_start在两个函数中连续调用时出现了一些问题.一个基本的例子如下:
std::string format(std::string fmt, ...)
{
char buf[2000];
va_list aq;
va_start(aq, fmt);
vsprintf(buf, fmt.c_str(), aq);
va_end(aq);
return std::string(buf);
}
void error(std::string fmt, ...)
{
va_list ap;
va_start(ap, fmt);
printf("%s", format(fmt, ap).c_str());
va_end(ap);
exit(1);
}
int main()
{
int x = 10;
printf("%s", format("Test %d\n", x).c_str());
error("Test %d\n", x);
}
Run Code Online (Sandbox Code Playgroud)
产生
Test 10
Test -1078340156
Run Code Online (Sandbox Code Playgroud)
似乎在使用该error函数时,参数已损坏.
传递va_list到另一个函数的正确方法是什么?
我开始想知道printf函数是如何声明的,它总是接收一个字符串作为第一个参数(好吧,const char*),然后其余参数可以是各种类型,它们的数量可变并且以不同的顺序给出。
这是否意味着printf针对每种可能性都对函数进行了声明和覆盖?这对我来说意义不大,所以它真的像这样工作还是与众不同?
另外,该功能如何实现?如果太复杂了,我只想知道它在内部一般是如何工作的。
对于以下代码:
void fun(char *msg, int n, int m, ...) {
va_list ptr;
va_start(ptr, m); // Question regarding this line
printf("%d ", va_arg(ptr, int));
}
Run Code Online (Sandbox Code Playgroud)
该函数调用如下:
fun("Hello", 3, 54, 1, 7);
Run Code Online (Sandbox Code Playgroud)
我的问题是关于上面评论的那一行.我尝试了该行的以下三个版本:
va_start(ptr, msg);
va_start(ptr, n);
va_start(ptr, m);
Run Code Online (Sandbox Code Playgroud)
在所有三种情况下,我得到"1"作为输出.根据我的阅读,第二个参数va_start应该是函数参数列表中的最后一个参数fun(),即va_start(ptr, m);应该是正确的调用.那么为什么我在这三种情况下得到相同的输出.
[我在Ideone上运行程序,如果这有任何后果.]
function f(...)
return ...
end
Run Code Online (Sandbox Code Playgroud)
我称之为:
f()
Run Code Online (Sandbox Code Playgroud)
例
a = f()
print(a) -- echoes 'nil', same as print(nil)
Run Code Online (Sandbox Code Playgroud)
但
print(f()) -- echoes newline, same as print(), that is, no args
t = {f()} -- same as t = {}
Run Code Online (Sandbox Code Playgroud)
那么,f()返回什么?
更新:不知道函数可以返回'void',同时发现这个http://lua-users.org/lists/lua-l/2011-09/msg00289.html.
我看到有人创建了一个具有未知数量参数的函数:
public static double calculator(double ... value){
double result=0d;
for(int i=0;i<?;i++){
result+=value;
}
return result
}
Run Code Online (Sandbox Code Playgroud)
现在我正在尝试创建一个for循环,该循环将以输入的参数数量运行次数,因此:
double calc = calculator(1,2,3,4,5)
Run Code Online (Sandbox Code Playgroud)
这将使for循环运行5次.
我编写了以下代码来创建一个带有构造函数的类,该构造函数将变量数(N)的整数加上两个double作为参数,如下所示:
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <array>
template <std::size_t N>
class point_t {
public:
std::vector<int> values;
template<typename ... Args>
point_t(Args ... args, double distance, double value) {
std::array<int , N> list = {(args)...};
for(std::size_t i=0; i<N; ++i) values[i] = list[i];
}
};
int main(int argc, char *argv[]) {
point_t<4> test(1, 2, 3, 4, 3.0, 6.7);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译器返回以下错误:
没有用于初始化'point_t <4>'的匹配构造函数
候选构造函数不可行:需要2个参数,但是提供了6个参数
我错过了什么?
我有这样的方法。
void method(int[] ...x){}
Run Code Online (Sandbox Code Playgroud)
并且我可以使用method(new int[]{1,2,3,4});
它来调用方法。但是编译器也会编译此2d数组类型。
method(new int[][]{new int[]{1,2,3},new int[]{4,5,6}});
Run Code Online (Sandbox Code Playgroud)
我想知道原因。 方法具有一维数组类型引用。但是编译器接受二维数组类型。