【问题标题】:Function returns correct value when i use conditional operator or if statement without return statement当我使用条件运算符或没有返回语句的 if 语句时,函数返回正确的值
【发布时间】:2020-02-27 01:50:49
【问题描述】:
#include<stdio.h>
int fact(int);
int main()
{
    int a, b;
    printf("enter a number : ");
    scanf("%d",&a);
    b=fact(a);
    printf("\n%d",b);
}
int fact(int y )
{
    int d=1;
    for(int i = 1;i<=y;i++)
            d*=i;
    d= d>0 ? d : 0;
}

如果我删除最后一条语句,O/P 是 a+1。 我已经用其他函数对此进行了检查,如果我使用 if 语句或条件运算符,该函数会返回正确的值。 我想知道为什么会这样。 谢谢。

【问题讨论】:

  • 你没有从函数返回任何值,所以发生的任何事情都是巧合。最好专注于编写正确的代码,而不是怀疑未定义行为的结果。
  • 如果您对“幕后”发生的事情感到好奇,您可以使用调试器单步执行代码。发生的事情可能具有教育意义,但在机器之间的行为不会相同。
  • 你应该从编译器那里得到一个警告,你在函数中没有return 语句。
  • 通常(但绝不总是)用于从函数返回值的同一处理器寄存器也是用于保存计算中间结果的寄存器。因此,如果函数 A 调用函数 B 认为函数 B 返回一个值,但函数 B 实际上并不包含 return 语句,那么函数 A 从该寄存器获取什么(想象它是官方返回值)通常会是什么含糊其辞,就像 B 使用的最后一个数字函数一样。 (不过,显然你永远不会想要刻意依赖这些怪癖。)

标签: c function if-statement return-value conditional-operator


【解决方案1】:
6.9.1 函数定义
...
12 如果到达终止函数的<strong>}</strong>,并且函数调用的值被 调用者,行为未定义。

简单地说,您看到的行为纯属偶然。没有充分的理由让您获得该特定结果或任何其他结果。

未定义 意味着代码是错误的,但编译器和运行时环境都不需要以任何特定的方式处理它。在您的情况下可能发生的情况是,用于从函数返回值的寄存器也被用于存储 d 的值,但这并不必须为真。如果您更改代码,您可能会得到不同的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 2013-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多