【问题标题】:C program bad code confusion (compare values)C 程序错误代码混淆(比较值)
【发布时间】:2021-12-06 02:38:18
【问题描述】:

只是试图比较 C 中的两个值,并找到较小的值。不小心以一种非常糟糕的方式做到了,但我不明白为什么 C 仍然让它运行......程序没​​有包含两个值相等的分支。但是当它给出两个相等的值时,它给程序给出了相同的值......请问C编译器是做什么的?谢谢! (下面的例子返回 3...)

int min(int x, int y);

int main(void)
{
    int a = 3, b = 3;
    printf("%d", min(a,b));
}

int min(int x, int y)
{
    if(x > y)
    return y;
}
    else if(x < y)
{
    return x;
}

【问题讨论】:

  • 在定义为这样做的函数中不返回值会导致未定义的行为。这意味着最终结果是不可预测的。编译器不需要标记所有未定义的行为。但是许多编译器会对此类错误发出警告。可能需要调高编译器的警告级别才能看到所有警告。
  • 不,编译器没有让这个程序运行,因为有明显的语法错误。如果您运行的源代码与您在此处发布的源代码不同,请改为发布该源代码。
  • @kaylum:关于“在定义为这样做的函数中不返回值会导致未定义的行为”:不返回值不会导致未定义的行为。使用未返回值的函数的值具有未定义的行为。 C 标准有意允许不返回值,因为有些函数有时返回值,有时不返回,例如获取或设置存储设置的函数,由其参数选择。
  • gcc 不会编译此类代码。你的编译器叫什么名字?
  • 对混乱感到抱歉...我发布的时候已经很晚了...花括号弄乱了...但是@kaylum解释了原因,以及其他帮助的答案我解决了混乱。谢谢大家!

标签: c compiler-errors min function-definition


【解决方案1】:

不小心用了很糟糕的风格,但我不明白为什么 C 还是让它运行吧。。

程序不应该编译,因为这段代码

int min(int x, int y)
{
    if(x > y)
    return y;
}
    else if(x < y)
{
    return x;
}

语法不正确。

这个 else 语句

    else if(x < y)
{
    return x;
}

放置在任何函数之外,包括min

看来你的意思

int min(int x, int y)
{
    if(x > y)
    {
        return y;
    }
    else if(x < y)
    {
        return x;
    }
}

但是当它给出两个相等的值时,它给程序给出了 相同的值...请问C编译器是做什么的?

程序具有未定义的行为,因为函数min 在其两个参数彼此相等时不返回任何内容。

来自 C 标准(6.9.1 函数定义)

12 如果到达终止函数的 },并且 函数调用被调用者使用,行为未定义。

例如应该这样定义

int min(int x, int y)
{
    return y < x ? y : x;
}

【讨论】:

  • 这不是发布的代码 - 很容易被奇怪的大括号位置所迷惑。
  • 哦,是的!感谢您的更正和资源:)
猜你喜欢
  • 2017-01-24
  • 1970-01-01
  • 2019-05-30
  • 2012-08-18
  • 2013-03-24
  • 2018-08-01
  • 2017-03-01
  • 1970-01-01
相关资源
最近更新 更多