【问题标题】:Why main runs with return type string even though it is defined with a integer return type?为什么 main 使用返回类型字符串运行,即使它是用整数返回类型定义的?
【发布时间】:2018-10-10 11:43:18
【问题描述】:

代码正在编译 evan,尽管 main 的返回类型为 int,但它可以与返回类型字符串一起使用,并且错误是什么原因造成的。

#include <stdio.h>

int main()
{
    int i=0;
    printf("Hello World");
    //if(i!=0)
       return "hai";
    return 0;
}

【问题讨论】:

  • "hai" 返回一个const char*,可以转换为int。不过,我认为它至少需要在 c++ 中进行显式转换。
  • 它在 C 中编译,但并非没有警告:godbolt.org/z/fIQzVv
  • @Blaze: "hai" 的类型为char[4],并在return 语句的上下文中转换为char*,没有const
  • 这根本不是有效的 C。从char *int 没有隐式转换。这是违反约束的。
  • 如果你想阻止无效的C代码在gcc中编译,你必须用-pedantic-errors编译。

标签: c function


【解决方案1】:

该程序是一个无效 C 程序。 "hai" 的类型为 char [4],在 return 语句的上下文中,它衰减为 char *

但是函数需要返回int。在return 的上下文中,如果通过赋值,就会发生这种情况。

char * 可以转换为 int,但它需要显式转换。在没有显式转换的情况下,这是违反约束的,编译器必须生成诊断消息,gcc 会这样做:

warning: return makes integer from pointer without a cast [-Wint-conversion]
    return "hai";
           ^~~~~

最后:footnote 中提到的 C 标准:

[符合标准的实现] 也可以成功翻译无效程序。

【讨论】:

    【解决方案2】:

    C

    您不返回字符串或指针,只返回转换为整数的指针。并且编译器会警告你,你已经在没有显式转换的情况下转换了指针。

    C++

    此代码将无法编译,因为 C++ 不允许这种隐式转换。

    【讨论】:

    • C++ 确实允许隐式转换。只是不是这个特定的。
    • @aschepler 我认为这个问题只是C。初学者倾向于将两种语言都放在标签中
    • 如果回答 C++,我会补充一点,如果演员表是明确的(即return (long)"hai";),C++ 会接受这个
    • @P__J__ “我认为这个问题只是 C。” => 那你为什么回答 C++ 呢?
    • C 和 C++ 都不允许从 char*int 的隐式转换。此代码在任何一种语言中都不是有效的。因此,这个答案具有误导性。 “它编译”不是语言强制执行的术语,它们仅强制执行诊断消息。如果你想防止非标准 C 用 gcc 编译,你必须使用-pedantic-errors。这并不意味着“给我迂腐的错误”,而是“如果我编写了无效的 C 代码,给我一个错误”。
    猜你喜欢
    • 2014-03-11
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    • 2020-09-05
    • 2013-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多