【问题标题】:How does main() function compare to other functions in C?main() 函数与 C 中的其他函数相比如何?
【发布时间】:2019-12-22 02:05:46
【问题描述】:

文档是:

在 C 中,“main”函数与每个函数都被视为相同,它具有返回类型(并且在某些情况下通过参数接受输入)。唯一的区别是主函数是在用户运行程序时被操作系统“调用”的。因此,main 函数始终是程序启动时执行的第一个代码。

但是当我跑步时

int main() {
    printf("%d", square(3));
    return 0;
}

int square(int n) {
    int sq = n * n;
    return sq;
}

程序打印 9。 那么 main() 函数是仅在所有其他函数之后才执行,还是以不同的方式特殊?

【问题讨论】:

  • main 被首先调用,并且正在调用其他函数。所以最终在main 终止之前被调用的函数terminate
  • 什么“所有其他功能”?唯一自动调用的函数是main
  • 说 main 被称为“第一”是一种误导。操作系统只调用过 main 。所有其他函数永远不会被调用,除非它们被 main() 调用,或者被 main() 调用的某个函数等调用。
  • 我不确定引用的来源(当然不是 C 语言标准),但它似乎相当准确,而且似乎也解决了这个问题。那么你真正想知道什么,和/或你观察到的行为让你质疑引用的描述是什么?
  • 如果你想象 OP 是 Python 用户第一次接触编译语言,这个问题就更有意义了

标签: c function main


【解决方案1】:

顺序是这样的:

  1. 操作系统调用main()
  2. main() 致电square(3)
  3. square(3) 计算结果9 并返回。
  4. main() 致电printf("%d", 9)
  5. printf() 在终端上打印 9 并返回打印的字符数 (1)。
  6. main() 向操作系统返回 0。

【讨论】:

  • 不完全正确。对printf() 的调用不会将“9”输出到终端。相反,printf() 将“9”输出到stdout 缓冲区。由于输出的数据不以 '\n' 结尾,因此数据位于stdout 缓冲区中,直到main() 函数退出。然后stdout 缓冲区的内容被传递到终端。
  • 这是一个我认为在讨论函数调用顺序时并不重要的细节。
【解决方案2】:

被定义和被调用是有区别的。

main() 是运行时直接调用来执行程序的一个函数。其他一些可能会在全局变量或其他一些特殊情况的初始化程序中被调用,但让我们忽略这些,特别是因为它们与您的情况无关。

所有其他人都被直接或间接地从那里调用。或者它们只是死代码。

main() 有另一个区别,因为 C99: return 0; 是隐含的。

顺便说一句,提高警告级别,所有在之前/未声明的情况下调用的函数都是错误。

【讨论】:

    【解决方案3】:

    这段代码

    int main() {
        printf("%d", square(3));
        return 0;
    }
    
    int square(int n) {
        int sq = n * n;
        return sq;
    }
    

    依赖于隐式函数声明的过时特性,因为在 main 中使用之前没有名称 square 的声明。在 1999 年的修订版中,此功能已从 C 标准中删除。为了向后兼容,所有最常用的 C 编译器仍然尊重它(带有警告),但实际上 using 它是不好的风格并且可以隐藏错误。您应该在main 上方使用square 的显式“前向声明”来编写此程序:

    int square(int n);
    
    int main(void)
    {
    /* remainder of program as you have it */
    

    (在函数声明或定义的参数括号之间根本不放任何东西也是一个过时的功能。要声明或定义一个不带参数的函数,你必须说(void)。 )

    (在 C 中,出于历史原因,首选风格是将函数定义的左大括号放在单独的行上,即使所有其他左大括号都“拥抱”到与 if、@ 相同的行上987654329@等)

    话虽如此,函数 square 被执行,因为在 main 中,它被调用:

    int main() {
        printf("%d", square(3));
                     ^^^^^^
        return 0;
    }
    

    也就是说,首先main 获得控制权,然后在main 内部调用函数square。如果main 没有调用square,或者调用调用它的函数,square 将永远不会被执行。

    函数main 与任何其他函数之间的区别在于,在主机环境中,函数main 包含程序的入口点,即它首先获得控制权。并且函数main可以在没有return语句的情况下定义,尽管它的返回类型是int

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-03
      • 1970-01-01
      • 2011-11-22
      • 2013-01-12
      • 1970-01-01
      • 1970-01-01
      • 2012-03-05
      • 2023-03-29
      相关资源
      最近更新 更多