int的默认值是1吗?

3

这个问题中了解到,在C++中在括号中放变量名是可以的
我尝试了以下程序:

#include <iostream>
int main()
{
    int (a)();
    std::cout << "if this works then deafult value of int should be " << a << std::endl;
    return 0;
}

并得到输出结果“如果这个有效,那么int的默认值应该是1”
那么这是真的吗?

编辑::
阅读@james-mcnellis的答案后,当我尝试给a赋值时,会出现错误“函数‘int a()’的赋值”

所以现在很清楚,这里的a是一个函数而不是变量。

2个回答

17

a 不是一个整型变量: 它是一个没有参数并返回一个 int 的函数。因为它是一个函数声明,所以 a 也不是局部变量,而且它没有“默认值”。

程序有误,因为你从未定义函数 a,但你试图使用它(通过在插入表达式中取它的地址)。因此,它违反了一个定义规则。

如果你在程序中定义了 a,那么将打印 1,因为函数 a 的地址将被转换为 bool: 带有 bool 参数的重载运算符 << 是函数指针参数类型的最佳匹配。

[注意:如果你在 Visual C++ 中定义了 a 并编译,它将打印函数的地址,而不是 1。这是因为 Visual C++ 允许将函数指针隐式转换为 void*,然后带有 void const* 参数的重载运算符 << 是函数指针参数类型的最佳匹配。如果你使用禁用语言扩展(/Za)编译,带有 bool 参数的重载将按预期选择。]


1
这不应该因为获取未定义函数的地址而导致链接器错误吗? - ildjarn
@ildjarn: 我认为应该可以。使用Visual C++工具链肯定可以编译通过。即使定义了a,也可能不会被编译通过:我不确定哪个operator<<会被使用。Visual C++打印函数地址(也许是因为它允许将函数指针转换为void*?),而g++则打印1(我也不知道为什么...)。 - James McNellis
3
g++正在使用转换为bool的功能。 - James McNellis
3
我尝试使用" g++ -Wall ..."命令,但出现警告信息:"warning: the address of 'int a()' will always evaluate as 'true' [-Waddress]"。 - dschulz
@ildjarn 当将a强制转换为(void *)时,会出现链接器错误 :: http://ideone.com/zqUWk,在定义a()之后,gcc还会打印它的地址 :: http://ideone.com/fF6NK - Eight

4

正如James McNellis所说,你声明的不是一个int,而是一个函数。

但是你可以像这样获得初始化为默认值的int:

int i = int();

默认值不是1,而是0。

std::cout << "this prints '0': " << int() << '\n';

在C++11中,你可以使用统一初始化方式:
int i {};

花括号不会像圆括号一样被误认为是函数声明的一部分。

int i = int(); 是值初始化;默认初始化将是 int i; - ildjarn

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