没有return语句的函数的返回值是多少?

时间:2016-08-29 14:13:42

标签: c return return-value function-call

#include<stdio.h>
int sel=5,out=10;

int findout(){
    if(sel==5)
        return out*=2;
}

int main(){
    int ret1,ret2=-1;
    ret1=findout();
    printf("before %d %d %d",sel,out,ret1);
    sel=8;out=7;
    ret2=findout();
    printf("\nafter %d %d %d",sel,out,ret2);
}

输出:

  <5>在5 20 20之前

     <8> 8 7 8之后

编辑:我的编译器没有显示任何警告。在这里你可以看到它。 它在Ubuntu OS上的代码块GNU GCC编译器

g++   -c /home/himani/Untitled1.cpp -o /home/himani/Untitled1.o
g++  -o /home/himani/Untitled1 /home/himani/Untitled1.o   
Process terminated with status 0 (0 minute(s), 0 second(s))
0 error(s), 0 warning(s) (0 minute(s), 0 second(s))

在第二种情况下,当我没有返回任何值(sel=8out =7)时,ret2的值是8的呢?

3 个答案:

答案 0 :(得分:12)

sel不是5时,您的函数findout()未通过return声明。

那是非法的C;并且你的编译器应该警告你。

请勿忽略编译器警告

答案 1 :(得分:7)

如果函数未显式返回值main()函数是异常),并且返回值在调用者中使用,则程序将调用undefined behavior

引用C11,章节§6.9.1

  

如果到达了终止函数的},则使用函数调用的值   调用者,行为未定义。

在这种情况下,当if条件的计算结果为false时,控制路径中没有return语句返回一个值,并且您正在使用< em>“expected”返回值,导致UB。

答案 2 :(得分:4)

这是一种不确定的行为。对于您的编译器,结果是8.但是例如在使用Clang编译之后:

Sub IDgen()

 Dim LastId As String
 Dim NewId As String
 Dim var1 As String
 Dim varN As Long
 Dim wsLVZKpk As Excel.Worksheet
 Dim wbLVZKpk As Excel.Workbook
 Dim wkb As Excel.Workbook
 Dim wks As Excel.Worksheet
 Dim objListRows As ListRows

 Set awkb = ActiveWorkbook
 Set awks = awkb.Sheets(1)


 awks.Activate
 var1 = Range("perceel").Value
 If var1 = "" Then
 awks.Activate
 MsgBox "select comp"
 Exit Sub
 End If

 LVZKpk = "c:\test.xlsm"
 Set wbLVZKpk = Workbooks.Open(LVZKpk)
 Set wsLVZKpk = wbLVZKpk.Sheets(1)

 If var1 = "com1" Then
 wsLVZKpk.Activate

 varN = Range("A:A").Find("AG", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
 LastId = Cells(varN, "A").Value
 NewId = "AG" & CLng(Mid(LastId, 3)) + 1
 awks.Activate
 Range("bestand").Value = NewId
 wbLVZKpk.Close

 ElseIf var1 = "comp2" Then
 wsLVZKpk.Activate
 varN = Range("A:A").Find("IG", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
 LastId = Cells(varN, "A").Value
 NewId = "IG" & CLng(Mid(LastId, 3)) + 1
 awks.Activate
 Range("bestand").Value = NewId
 wbLVZKpk.Close


 ElseIf var1 = "com3" Then
 wsLVZKpk.Activate
 varN = Range("A:A").Find("GC", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
 LastId = Cells(varN, "A").Value
 NewId = "GC" & CLng(Mid(LastId, 3)) + 1
 awks.Activate
 Range("bestand").Value = NewId
 wbLVZKpk.Close

 End If


 Exit Sub

 End Sub

跑步时:

clang-3.5 main.cpp
main.cpp:6:1: warning: control may reach end of non-void function [-Wreturn-type]