C++可以通過異常處理的throw和catch來實(shí)現(xiàn)從子函數(shù)的子函數(shù)直接返回主函數(shù),匯編語言可以用jmp指令跳轉(zhuǎn)實(shí)現(xiàn)這個需求。
10年積累的成都做網(wǎng)站、成都網(wǎng)站制作經(jīng)驗(yàn),可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有那曲免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
C語言主要靠函數(shù)調(diào)用和return在函數(shù)之間切換,很難做到在多層調(diào)用中直接返回主函數(shù)。雖然goto語句可以無條件跳轉(zhuǎn),但是必須在同一個函數(shù)中使用。
因此解決的方法也是用一個特殊的值作為需要返回的標(biāo)志,然后在兩層調(diào)用函數(shù)中都遇到該值就返回,但是這個方法也有兩個前提:
1)你的兩個子函數(shù)都是由返回值的函數(shù)
2)你選擇的特殊值和函數(shù)正常的返回的取值不會沖突,不會引起二義性。
因此建議你的這個問題還是用C++ 的異常去解決比較好。
函數(shù)返回上一級使用return語句就行了。
c標(biāo)準(zhǔn)庫里有一套函數(shù):setjmp/longjmp ,程序員可以在任意位置調(diào)用setjmp保存現(xiàn)場,然后在任意另外位置調(diào)用longjmp跳到那個保存的現(xiàn)場。這樣就可以滿足直接調(diào)回主函數(shù)的需求,但這套函數(shù)保存現(xiàn)場并不充分,而且打破正常流程控制,很不穩(wěn)定,一般來所不推薦使用。
C語言是沒有try語句的,還有,你這個地方也就算是一個函數(shù)(在C語言里面你寫的這個try只能是函數(shù))
有語法錯誤,幫你改了,你自己再看看
#includestdio.h
void try(int,int,int);
int main()
{
int x=2,y=3,z=0; //y=3
printf("(1)x=%d y=%d z=%d\n",x,y,z);
try(x,y,z);
printf("(4)x=%d y=%d z=%d\n",x,y,z);
}
void try(int x,int y,int z)
{
printf("(2)x=%d y=%d z=%d\n",x,y,z);
z=x+y;
x=x*x;
y=y*y;
printf("(3)x=%d y=%d z=%d\n",x,y,z);
}
一點(diǎn)補(bǔ)充:最開始我運(yùn)行你這個程序是在一個.cpp文件里面寫的代碼,然后運(yùn)行,但是程序會報錯,為什么呢?因?yàn)閏pp一般而言是C++的文件,C++里面有try語句,try是他的一個關(guān)鍵字,所以函數(shù)名不能是關(guān)鍵字,程序報錯了。
但是在一個.c文件里面是沒有問題的~~
還有,你這個真心是一個函數(shù),不是try語句,try語句是
try
{
do something
}
catch(some error)
{
do something
}
C語言里try是一個語句或函數(shù)。其作用是是拋出錯誤用。
將有可能產(chǎn)生錯誤的語句括在一起,放入try語句塊。如果在try語句塊中發(fā)生異常,F(xiàn)lashPlayer會創(chuàng)建一個錯誤對象,并將該Error對象派發(fā)至第一個可用的catch塊。catch語句塊提供對錯誤的處理。如果沒有try語句,或者try語句沒有出現(xiàn)錯誤,則catch語句不會被引發(fā)。如果在try語句塊的其中某個語句中檢測到錯誤,則會執(zhí)行附加到該try語句的catch語句。catch語句可以并列使用,即在一個try語句塊之后,存在多個catch語句塊,以處理不同的錯誤對象。
try語句是:
try
{
do something
}
catch(some error)
{
do something
}
1、在c++中,可以直接拋出異常之后自己進(jìn)行捕捉處理,如:(這樣就可以在任何自己得到不想要的結(jié)果的時候進(jìn)行中斷,比如在進(jìn)行數(shù)據(jù)庫事務(wù)操作的時候,如果某一個語句返回SQL_ERROR則直接拋出異常,在catch塊中進(jìn)行事務(wù)回滾,用法:
#include iostream ?#include exception
using namespace std;
int main () {
try
{
throw 1;
throw "error";
}
catch(char *str)
{
cout str endl;
}
catch(int i)
{
cout i endl;
}
}
2、?try 和catch定義異常類來進(jìn)行處理:
#include iostream ?#include exception
using namespace std;
//可以自己定義Exception ?class myexception: public exception
{
virtual const char* what() const throw()
{
return "My exception happened";
}
}myex;
int main () {
try
{
if(true) ? ?//如果,則拋出異常;
throw myex;
}
catch (exception e)
{
cout e.what() endl;
}
return 0;
}
擴(kuò)展資料
c++的特點(diǎn):
1、C++通過建立用戶定義類支持?jǐn)?shù)據(jù)封裝和數(shù)據(jù)隱藏。
2、C++是支持?jǐn)?shù)據(jù)封裝的工具,對象則是數(shù)據(jù)封裝的實(shí)現(xiàn)。
3、采用多態(tài)性為每個類指定表現(xiàn)行為。多態(tài)性形成由父類和它們的子類組成的一個樹型結(jié)構(gòu)。
4、C++現(xiàn)有類的基礎(chǔ)上可以聲明新類型,這就是繼承和重用的思想。通過繼承和重用可以更有效地組織程序結(jié)構(gòu),明確類間關(guān)系,并且充分利用已有的類來完成更復(fù)雜、深入的開發(fā)。新定義的類為子類,成為派生類。
參考資料來源:百度百科—C++