#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=8
和out =7
)时,ret2
的值是8
的呢?
答案 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]