将带有默认值的数组作为参数传递到int main()函数中

10
我在将带有默认值的数组作为参数传递到 int main() 函数时遇到了困难。 例如:
int main(int a){}

工作得非常好。同样如此。

int main(int a = 1){}

传递数组给 int main() 也非常有效:
int main(int a[3])

然而,将这两个概念结合起来似乎会产生矛盾:
int main(int a[1] = {0,1})

经过大量的谷歌搜索,我没有找到解决方案。

请帮助我SO,你是我的唯一希望!

编辑

简而言之,这个程序的目的是为了让我的代码尽可能少的行数,为了我教授最近提出的挑战(不是为了得分--只是为了学习)。任务是创建一个递归的“圣诞节12天”程序。

这是我的当前程序

#include <iostream> 
#include <string>
void p(std::string v){std::cout<<v;}
std::string v[13] = {"A Partridge in a Pear Tree.\n\n","2 Turtle Doves\n","3 French Hens\n","4 Colly Birds\n","5 Gold Rings\n","6 Geese-a-Laying\n","7 Swans-a-Swimming\n","8 Maids-a-Milking\n","9 Ladies Dancing\n","10 Lords-a-Leaping\n","11 Pipers Piping\n","12 Drummers Drumming\n",""};
int main(){
    switch(v[12].length()){
        case 12:system("pause"); return 0;
        case 11:p(v[11]);
        case 10:p(v[10]);
        case 9: p(v[9]);
        case 8: p(v[8]);
        case 7: p(v[7]);
        case 6: p(v[6]);
        case 5: p(v[5]);
        case 4: p(v[4]);
        case 3: p(v[3]);
        case 2: p(v[2]);
        case 1: p(v[1]);
        case 0: p(v[0]); 
    }v[12] += "0";
    main();
}

我希望将诗歌数组作为参数传递给主函数,而不是在函数上面声明它。我知道这样不太考虑内存/栈的问题,但它可以省去一行代码 :)

1
一个只接受 int 或数组的 main() 函数不是标准 C++ 中有效的形式。你在这里想做什么? - In silico
5
在C++程序中禁止调用main()函数。您需要创建另一个递归函数来代替。 - James McNellis
3
@Michael:根据标准,这是不被允许的。你应该把所有的逻辑移到另一个函数中,这样你就可以递归调用该函数了。 - Anthony
2
@Michael:这不是我们的意思。那只是某个人(相当复杂)的编码标准,我们谈论的是语言标准,即定义C++是什么的文件。 - GManNickG
2
当然,你的教授是否想要标准的C++/是否是一位好教授是另外一回事。 - GManNickG
显示剩余6条评论
4个回答

19

最好的解释在这个链接中:

在 C++ 中,不可能将整个内存块作为值传递给函数,但允许将其地址传递。

这就是为什么可以使用以下方式声明函数:

void foo (int bar[]);

但是你不能声明

void foo (int bar[] = {0 ,1});

这与 main() 函数无关。


很棒的链接和简单易懂的解释。为你点赞(啊!由于声望不高,无法进行点赞操作)。 - Michael Jasper
使用C++0x,你可以做到!但是当该数组超出作用域时,它将被销毁。 - Vanuan

8

针对数组传递而非main()的不太可能使用,由于数组实际上被传递为指针,您可以像这样处理:

int defaultInit[2] = {0,1}; // {0,1} means 2 elements for the array.

int f(int arg[2] = defaultInit)
{
    return 0;
}

3

main()函数只应该接收零个或两个参数,即命令行参数的数量和参数本身。

int main(int argc, char* argv[]) {
}

argc是参数的数量,argv是包含参数的C字符串数组。

编辑:

他改变了重点。 你可以通过这样做来减少代码行数:

void loop(int i) { 
    if (i < 0) { v[12] += "0"; return; }
    p(v[i]);
    loop(i-1);
}
int main() {
    if (v[12].size() == 12) return;
    loop(v[12].size());
    main();
}

所以,主函数不能接收默认参数,就像构造函数或其他函数一样?例如:int main(int a=5){} - Michael Jasper
这不是标准的做法。但你可以在那里做很多事情来减少代码行数。例如,使用 for 循环可以大大减少代码行数。 - Murilo Vasconcelos
一個 for 循環將非常有益!不幸的是,其中一個要求是“禁止循環”,因為他想教我們遞歸的威力。 - Michael Jasper
好的,我不会再玩你的玩具了 :) - Murilo Vasconcelos
我很想提交最后的编辑,但是我的良心不允许我这样做。 - Michael Jasper

1
#include <stdio.h>
int go(int);
int main( int argc, char*argv[]) {
go(0);
}
int go(int argc) {
const char* lyrics[] = {...};
printf("On the %d%s day of Christmas\nmy true love gave to me\n",argc,
  argc==1?"st":argc==2?"nd":argc==3?"rd":"th" );
for(int i=argc-1;i>0;--i) { printf("%d %s\n",i+1,lyrics[i]); }
printf("%s\n\n",lyrics[0]);

if( argc < 12 ) go(argc+1);
return 0;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接