函数C++中的行为

Functions behavior in C++

本文关键字:C++ 函数      更新时间:2023-10-16

我有以下代码:

int Fun(int x, int y)
{
    if(x<y)
        return 1;
}
int main ()
{
    cout<<Fun(6,2)<<endl;
}

此代码的输出为 6(x 的值)!!我不知道为什么会有这种行为...任何人都可以向我解释一下。

提前谢谢。

在这里,你有一个 Undefined 的行为,就像已经说过的那样。

正如C++11标准中所述:

6.6.3 返回语句

  1. [..]从函数末尾流出等效于没有值的返回;这会导致值返回函数中出现未定义的行为。

解释:

int Fun(int x, int y)
{
    if ( x < y ) // if this condition is false, then no return statement
        return 1;
}

如何解决这个问题?

int Fun(int x, int y)
{
    if ( x < y )
    {
        return 1;
    }
    return 0;  // <-- Fix the error
}

注意:您的编译器至少应该给您一个警告...你忽略了吗?(类似于"并非所有控制路径都返回值")

你在 Fun 结束时缺少一个返回语句

int Fun(int x, int y)
{
    if(x<y)
        return 1;
    return 0;
}

你得到的 6 只是未定义的行为(你可以得到任何东西......甚至是核心转储)用于应该返回但不返回的函数

请注意,现有的返回 1 在 if(x<y) 的范围内...因为不带大括号 { } 的 if 将 ONE 语句作为主体。

您在 Fun 结束时缺少返回语句

你因为Function Prologue and Epilogue而变得6。 调用函数时,程序会将62放入堆栈中,返回值将保存在寄存器eax。 因此,根据我的知识,在比较值程序时会6复制到eax寄存器,并且由于您没有返回任何内容,因此eax寄存器不会更新。 调用程序读取数据从eax寄存器中6.

请检查这部分,我已经从您的示例中生成了汇编代码。

        movl    8(%ebp), %eax       //eax has value 6
        cmpl    12(%ebp), %eax
        jge     .L5                //if true (x>y) then jump to .L5
        movl    $1, %eax           //updating eax to 1 if false (x<y)
        movl    %eax, -4(%ebp)
        jmp     .L1
.L5:
        jmp     .L4
.L1:
        movl    -4(%ebp), %eax
.L4:
        leave
        ret                        //returning from function eax still have value 6 as per your code