gpt4 book ai didi

c - C语言中的奇怪整数

转载 作者:行者123 更新时间:2023-11-30 18:23:29 24 4
gpt4 key购买 nike

我有代码:

#include <stdio.h>

int main() {
int a = sum(1, 3);

return 0;
}

int sum(int a, int b, int c) {
printf("%d\n", c);

return a + b + c;
}

我知道我必须先声明函数,然后才能调用它们,但我想了解发生了什么。

(由gcc v6.3.0编译)

我忽略了函数警告的隐式声明并运行了程序几次,输出是这样的:

1839551928
-2135227064
41523672
// And more strange numbers

我有两个问题:

1)这些数字意味着什么?

2) 函数main如何知道如何在没有声明的情况下调用函数sum

最佳答案

我假设您问题中的代码是您实际编译和运行的代码:

int main() {
int a = sum(1, 3);

return 0;
}

int sum(int a, int b, int c) {
printf("%d\n", c);

return a + b + c;
}

调用printf无效,因为您没有所需的 #include <stdio.h> 。但这不是您要问的,所以我们会忽略它。 问题已被编辑以添加包含指令。

在标准 C 中,自 1999 年标准以来,调用没有可见声明的函数(在本例中为 sum)是一种违反约束的行为。这意味着需要进行诊断(但合格的编译器如果选择这样做,仍然可以成功编译程序)。除了语法错误之外,约束违规也是 C 语言最接近的判断某事不合法的行为。 (#error 指令除外,它必须导致翻译单元被拒绝。)

在 C99 之前,C 有一个“隐式 int ”规则,这意味着如果您调用没有可见声明的函数,则会创建隐式声明。该声明适用于返回类型为 int 的函数。 ,以及您传递的参数的(升级)类型的参数。您的来电sum(1, 3)将创建一个隐式声明 int sum(int, int) ,并生成一个调用就像函数是这样定义的。

由于它不是这样定义的,因此行为是未定义的。 (最有可能的是,其中一个参数的值,也许是第三个,将从某个任意寄存器或内存位置获取,但标准没有说明关于调用实际执行的操作。)

C99(1999 年版 ISO C 标准)删除了隐含的 int规则。如果您使用符合 C99 或更高版本的编译器编译代码,则编译器需要诊断 sum(1, 3) 的错误。称呼。为了向后兼容旧代码,许多编译器将打印非致命警告并生成假设定义与隐式声明匹配的代码。许多编译器默认情况下是不符合标准的,甚至可能不会发出警告。 (顺便说一句,如果您的编译器确实打印了错误或警告消息,那么如果您将其包含在您的问题中,将会非常有帮助。)

你的程序有问题。符合要求的 C 编译器至少必须警告您,并且可能会拒绝它。如果您不顾警告而运行它,则行为是未定义的。

关于c - C语言中的奇怪整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55190663/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com