首页 > 解决方案 > 查询c++中函数的默认返回类型

问题描述

一本书说:

如果未提及返回类型,则默认为 int。

为了检查这一点,我编写了以下代码。

#include <iostream>

print() {
    return 3.3;
}

int main(void) {
    double d = print();
    std::cout << d;

    return 0;
}

正如预期的那样,我得到了输出3。这里没有问题。

我尝试了以下代码,这引起了一些混乱:

#include <iostream>

print() {
    char x = 97;
    std::cout << x;

    return x;
}

int main(void) {
    char c = print();
    std::cout << c;

    return 0;
}

我在这里期待错误,但我得到的输出为aa.


我在这里有两个疑问:

  1. 如果print函数的返回类型默认为int,并且当我返回字符变量时,为什么我没有收到任何编译错误?

  2. 究竟返回了print()什么?由于没有错误,显然print()已经返回97。而是x在存储a。那怎么97退的?

标签: c++cfunctioncastingreturn-type

解决方案


[自 VS2005 起在 Visual Studio C++ 中]

您必须指定返回类型,否则您将得到编译“错误 C4430:缺少类型说明符 - 假定为 int。注意:C++ 不支持 default-int” ...其他系统仅生成警告。

但是,您故意忽略了第一个问题。所以让我们假设无论如何都有print()回报......int

  1. 如果 print 函数的返回类型默认为 int,并且我返回字符变量,为什么我没有收到任何编译错误?
  • 您可以简单地通过分配给“int”来转换“char”类型
  1. print() 究竟返回了什么?由于没有错误,显然 print() 已返回 97。但 x 正在存储 a。那么97是如何返回的呢?
  • print() 返回一个integer由 0 和 1 组成的集合:十进制表示为 97,ASCII 表示为 'a'。任何变量都只是一组零和一,可以用不同的格式表示:十进制、十六进制、ASCII 字符等。

--

如果你想看到 9797 你必须写:

#include <iostream>

int print() // 1st issue: Add a return-type
{
    char x = 97; // The ASCII code of 'a' character
    std::cout << static_cast<int>(x); // 2nd issue: Cast to int, or it will print 'a'

    return x; // You can convert a 'char' type simply by assigning to an 'int'
}

int main()
{
    char c = static_cast<char>(print());
    std::cout << static_cast<int>(c); // Same 2nd issue
}

“C++ 编译器将charsigned charunsigned char类型的变量视为具有不同的类型。默认情况下,类型变量char被提升为就int好像它们是类型一样signed char,除非使用 /J 编译选项。在这种情况下,它们被视为类型unsigned char并且是升级为int无符号扩展。” 微软文档


推荐阅读