【问题标题】:How an int can be equal to another function returning long int?一个 int 如何等于另一个返回 long int 的函数?
【发布时间】:2016-02-24 18:36:09
【问题描述】:

我在 C 中有以下代码

#include <stdio.h>
#include <limits.h>

long checks();

void main() {
    int results = checks();
    printf("%d", results);
}

long checks(){
    return LLONG_MAX;
    }

它给出 -1 的输出

尽管声明了函数原型,但这个文件如何甚至编译? int results = checks(); 应该会报错!

而且返回类型不匹配!

在 C 中函数的返回类型不能等于相同的数据类型?

【问题讨论】:

  • 在传递 int 的最大值后,它又回到 int 的最小值
  • LLONG_MAXlong long 数据类型的最大值,不一定与long 数据类型相同(特别是在i86 上,intlong 都是4字节长,而long long 是 8 个字节)。编译时在 (-Wall) 上发出警告以捕获这类事情。
  • @WeatherVane:准确地说,因为0x7FFFFFFFFFFFFFFF被截断为0xFFFFFFFF
  • 如果 longint 大小相等(32 位),那么问题就在这里:return LLONG_MAX;long long 返回为 long
  • 你的编译器想对你大喊大叫。启用警告。

标签: c function types


【解决方案1】:

C 对这样的事情非常“宽容”。隐式类型转换通常不是 C 语言中的错误。当然,这是一个哲学问题,现代答案与编写第一个 C 编译器时的答案截然相反。现在我们不称其为宽恕,我们实际上称其为非常不可宽恕,因为它让错误未被发现。

您可以让大多数现代 C 编译器针对此类情况发出警告,但您需要检查编译器的文档以了解如何启用警告。 (可能类似于“-Wall”。)

【讨论】:

  • 我来自 C#,这些错误很严重! :p 那么,在 C 中,函数的返回类型不能等于相同的数据类型?
  • 与函数无关。在 C 中你甚至可以做 long a; int b; b = a;
  • 没错,类型并不总是需要相同,但您至少应该看到一个警告。 C 程序员通常会在运行程序之前查看警告并尝试消除它们。
  • @joeytwiddle: 对于 C 来说不太合理。你知道signed char x, y, z; z = x + y; 导致将xy 转换为int,产生int 和,然后转换结果到signed char?自然,编译器会做一些有效的事情,但在语义上,这就是符号的字面意思。
  • 在 Ubuntu 中使用 CodeBlock 的 GCC.... 在添加 @Olaf 建议的 -Wconversion 后修复它:D
【解决方案2】:

对于任何寻求快速修复的人,

Mike已经说过的大部分内容....

它应该给出关于这种隐式转换的警告...

我必须启用-Wconversion 标志才能显示警告:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    • 2010-09-13
    • 2014-06-28
    相关资源
    最近更新 更多