C++ exam, who gets the first one correct?
Possible Duplicate:
What is the proper declaration of main?
我刚参加了我的第一次C++考试。第一个问题是
int main(?, char ** argv)
Which one of the following suggestions will not work (as first formal parameter substitute for ?):
1 2 3 4
| a) char argc
b) int argc
c) double argc
d) bool argc |
< BR>答案在4小时纯手写的个人考试中占2%。
允许使用所有工具,接受任何可编程设备或任何通信方式
谁能正确理解这一点:)?
- 你有没有解释过,或者这是实际问题?如果是,那么它的形式化就很差。
- 问题需要指定一个实现,或者询问哪一个可以工作。其中一个是由C++保证的,所以它是否完全取决于实现是否允许其他的,如果是的话,会发生什么。很多写这些考试的人都知道C++比很多人都不那么好,所以我认为如何在"C++愚蠢"中通过考试并不是网站的主题。
- @Juanchopanza和Steve Jessop。这是完整的问题。最初是用丹麦语问的,但翻译成英语是相当准确的。
- @用户1361521:我不会投你反对票,但是请给主考发一个"-1"。
- 我会给任何提出问题的人0分,除非丹麦语中的"不起作用"并不完全含糊不清。
- 这个问题需要认真界定什么是行不通的意思。总是有办法让它"工作",包括肮脏的黑客,但它是有效的。无聊的。
- 或者,如果问题允许你检查多个答案,丹麦语短语这里翻译为"其中哪一个"也可以理解为"其中哪一个"。
- ……)只有一个具体的答案应该是正确的。
- "不起作用"这个词在丹麦语中同样含糊不清。
定义"工作"的含义。其中任何一个都可以工作,但是一个有效的、标准兼容的、格式良好的C++程序具有以下签名之一:
1 2 3
| int main()
int main(int argc, char** argv)
int main(int argc, char* argv[]) |
所以a)、c)和d)是错误的。
- 我认为在任何使用a)c)或d)的人身上使用线索棒(2x4)是应该被允许的。从技术上讲,在sizeof(char)==sizeof(int)a的平台上可以很好地工作,但我仍然不希望看到它。
- @你是说乌兰巴托没事,只要它按预期工作?
- 我说"可以工作"和"永远不想看到它",也许"一周中的每一天都不会爆炸","用棍子打他们一下,只是为了确保"会更好。这些学校推UB的问题真让我恶心。
- 是UB吗?我认为是实现定义了哪些签名支持main(而不是返回必须是int)。我认为任何附加签名的含义也是实现定义的,而不是UB。当然,有些实现到了不一致的程度,因为编译器和链接器实际上都不会检查main是否具有支持的签名。
- @SteveJessop对UB的评论只是一个类比,我并不是暗示有一个不同的签名是UB。只是说,即使某些事情看起来是有效的,也不能使它正常。
- 可能"工作良好"和"工作良好"之间存在技术差异。工作顺利但不顺利的事情是最卑鄙的虫子!
- @ Steve Jessop。我同意。然而,这个问题只需要1个具体的答案就可以了。
- @史蒂夫杰索普哦,是的-不幸的是,它工作得很好。)
- main的签名是实现定义的;除了两个必需的签名外,唯一的要求是它们都返回int。如果程序使用不受支持的main的签名,我认为需要进行诊断;从QoI的角度来看,这当然是必需的。因此b)是有保证的,a)、c)和d)是实现定义的,但要么不能编译,要么会工作。
定义"不起作用"?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| int main(char argc, char ** argv)
{
printf("%d
", argc);
return 0;
}
./a.out 1 2 3
Output: 4
int main(int argc, char ** argv)
{
printf("%d
", argc);
return 0;
}
./a.out 1 2 3
Output: 4
int main(double argc, char ** argv)
{
printf("%d
", *(int*)&argc);
return 0;
}
./a.out 1 2 3
Output: 4
int main(bool argc, char ** argv)
{
printf("%d
", argc);
return 0;
}
./a.out 1 2 3
Output: 4 |
- +1:违反考试规则,使用可编程设备:)
- @蝉——关于"不起作用":你的猜测和我的一样好。您使用的是哪个编译器?在Xcode中,我只成功地编译了选项b)。
- 使用G++4.5.2,编译了所有内容(不过在A、C、D上有一个警告),并且所有内容都正常运行。
既然问题是问哪一个不起作用。它必须是double,所有其他的都是整数。
我相信这是正确的答案,因为除了整数值之外,不能用其他任何东西索引数组。但这假设您实际上想要索引argv数组。
但是在C++考试中问什么问题呢?
- 这确实是"哪一个不起作用"——只有选择一个选项才有资格作为答案。你能解释一下你为什么要争论这个问题吗?对我来说,它们都具有相同的功能,只要调用main()的参数不超过argc所能容纳的。
- 回答编辑…
"int argc"是正确的用法。argc表示传递给主服务器的参数数。所以这是唯一的内景。