为什么 std::cout << main << std::endl 输出 1?

6
#include <iostream>

int main(){
    std::cout << main << std::endl;
    return 0;
}

为什么命令行会打印出1?

2
出于好奇,你期望这段代码会打印什么?在这种情况下,main是一个函数指针。 - Jonathon Reinhart
@JonathonReinhart:是吗?请记住,main函数是特殊的... - Deduplicator
1
这可能是未定义行为。不要将函数命名为main。请参见https://dev59.com/o3I95IYBdhLWcg3w2Rvz#2128727。 - juanchopanza
5
你的程序中不允许使用 main 函数。大多数编译器会发出警告。 但对于普通函数的名称,它仍然会打印 1,因为函数指针被隐式转换为 bool 类型。 - T.C.
1
相关:函数指针将被转换为布尔值。http://stackoverflow.com/questions/25540033/is-visual-studio-buggy-in-printing-the-function-address - phuclv
显示剩余2条评论
1个回答

6

您的程序存在问题。N4140:

§3.6.1/3 函数main不应在程序中使用。[...]

如果我们假设程序没有问题,最有可能的解释是标准转换:

§4.3/1 函数类型T的左值可以转换为类型为“指向T的指针”的纯右值。结果是函数的指针。

§4.12/1 算术、未作用域枚举、指针或指向成员类型的纯右值可以转换为类型bool的纯右值。零值、空指针值或空成员指针值转换为false;任何其他值转换为true。对于直接初始化(8.5),类型为std::nullptr_t的纯右值可以转换为类型为bool的纯右值;结果值为false

如果您坚持这样做,请尝试:

std::cout << (void*)main << std::endl;

不要忘记这一部分,即 std::ostream 没有接受带有签名 int (*)(void) 的函数指针的 << 运算符,这就是为什么指针被转换为另一种类型的原因。 - Remy Lebeau
这个问题中,我看到main被多次使用。 - phuclv
@LưuVĩnhPhúc 那是C语言。到目前为止,我还没有看到任何标准引用表明在C语言中这是不合法的。 - user3920237

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