選擇結構 案例分析

C語言goto,longjmp()和setjmp()之間有什么區別

goto語句實現程序執行中的近程跳轉(local jump),longjmp()和setjmp()函數實現程序執行中的遠程跳轉(nonlocaljump,也叫farjump)。通常你應該避免任何形式的執行中跳轉,因為在程序中使用goto語句或longjmp()函數不是一種好的編程習慣。

goto語句會跳過程序中的一段代碼并轉到一個預先指定的位置。為了使用goto語句,你要預先指定一個有標號的位置作為跳轉位置,這個位置必須與goto語句在同一個函數內。在不同的函數之間是無法實現goto跳轉的。

下面是一個使用goto語句的例子:
void bad_programmers_function(void)
{
???? int x
???? printf("Excuse me while I count to 5000... \n") ;
???? x----l~
???? while (1)
??? {
?????????? printf(" %d\n", x)
?????????? if (x ==5000)
???????????????? goto all_done
?????????? else
???????????????? x=x+1;
??? }
all_done:
???? prinft("Whew! That wasn't so bad, was it?\n");
}
如果不使用goto語句,是例可以編寫得更好。下面就是一個改進了實現的例子:
void better_function (void)
{
???? int x
???? printf("Excuse me while I count to 5000... \n");
???? for (x=1; x<=5000, x++)
?????????? printf(" %d\n", x)
???? printf("Whew! That wasn't so bad, was it?\n") ;
}

前面已經提到,longjmp()和setjmp()函數實現程序執行中的遠程跳轉。當你在程序中調用setjmp()時,程序當前狀態將被保存到一個jmp_buf類型的結構中。

此后,你可以通過調用longjmp()函數恢復到調用setjmp()時的程序狀態。與goto語句不同,longjmp()和setjmp()函數實現的跳轉不一定在同一個函數內。然而,使用這兩個函數有一個很大的缺陷,當程序恢復到它原來所保存的狀態時,它將失去對所有在longjmp()和setjmp()之間動態分配的內存的控制,也就是說這將浪費所有在longjmp()和setjmp()之間用malloc()和calloc()分配所得的內存,從而使程序的效率大大降低。

因此,你應該盡量避免使用longjmp()和setjmp()函數,它們和goto語句一樣,都是不良編程習慣的表現。

下面是使用longjmp()函數和setjmp()函數的一個例子:
#include <stdio.h>
#include <setjmp.h>
jmp_buf saved_state;
void main(void);
void call_ longjmp (void);
void main(void)
{
???? int ret_code;
???? printf("The current state of the program is being saved... \n");
???? ret_code = setjmp (saved_state)
???? if (ret_code ==1)
???? {
?????????? printf("The longjmp function has been called. \n" )
?????????? printf("The program's previous state has been restored. \n");
?????????? exit(0)
???? }
???? printf("I am about to call longjmp and\n");
???? printf('return to the previous program state... \n" )
???? call_ longjmp ( )
}
void call_longjmp (void)
{
???? longjmp (saved_state, 1 )
}

switch語句的最后一個分支可以不要break語句嗎

盡管switch語句的最后一個分支不一定需要break語句,但最好還是在switch語句的每個分支后面加上break語句,包括最后一個分支。

這樣做的主要原因是:你的程序很可能要讓另一個人來維護,他可能要增加一些新的分支,但沒有注意到最后一個分支沒有break語句,結果使原來的最后一個分支受到其后新增分支的干擾而失效。在每個分支后面加上break語句將防止發生這種錯誤并增強程序的安全性。

此外,目前大多數優化編譯程序都會忽略最后一條break語句,所以加入這條語句不會影響程序的性能。

請參見:
1、什么時候用一條switch語句比用多條if語句更好?
2、switch語句必須包含default分支嗎?

C語言switch語句必須包含default分支嗎

不!但是為了進行錯誤檢查或邏輯檢查,還是應該在switch語句中加入default分支。

例如,下述switch語句完全合法:
switch (char_code)
{
????? case tyt:
????? case 'y': printf ( " You answered YES ! \n" )
?????????? break
????? case 'N':
????? case 'n': printf ("You answered NO!\n");
?????????? break
}

但是,如果一個未知字符被傳遞給這條switch語句,會出現什么情況呢?這時,程序將沒有任何輸出。因此,最好還是加入一個default分支,以處理這種情況:
......
default: printf ("Unknown response : %d\n", char_code);
????????? break
......

此外,default分支能給邏輯檢查帶來很多方便。例如,如果用switch語句來處理數目固定的條件,而且認為這些條件之外的值都屬于邏輯錯誤,那么可以加入一個default分支來辨識邏輯錯誤。

請看下列:
void move_cursor (int direction)
{
???? switch (direction)
???? {
?????????? case UP:???? cursor_up()
??????????????????????????? break
?????????? case DOWN:?? cursor_down()
??????????????????????????? break
?????????? case LEFT:?? cursor_left ()
??????????????????????????? break
?????????? case RIGHT:? cursor_ right ( )
???????????????????????????? break
?????????? default:???? printf ("Logic error on line number %ld!!! \n",
???????????????????????????????????? __ LINE__ )
???????????????????????????? break
???? }
}

請參見:???
1、什么時候用一條switch語句比用多條if語句更好?
2、Switch語句的最后一個分支可以不要break語句嗎?

C語言編程中,什么時候用一條switch語句比用多條if語句更好

如果你有兩個以上基于同一個數字(numeric)型變量的條件表達式,那么最好使用一條switch語句。

例如,與其使用下述代碼:
if (x ==l)
???? printf ("x is equal to one. \n");
else if (x ==2)
???? printf ("x is equal to two. \n");
else if (x = =3)
???? printf ("x is equal to three. \n");
else
???? printf ("x is not equal to one, two, or three. \n");
不如使用下述代碼,它更易于閱讀和維護:
switch (x)
{
???? case 1:? printf ("x is equal to one. \n");
????????????????????? break;
???? case 2:? printf ("x is equal to two. \n");
????????????????????? break
???? case 3:? printf ('x is equal to three. \n");
????????????????????? break;
???? default: printf ("x is not equal to one, two, or three. \n");
????????????????????? break;
}

注意:使用switch語句的前提是條件表達式必須基于同一個數字型變量。例如,盡管下述if語句包含兩個以上的條件,但該例不能使用switch語句,因為該例基于字符串比較,而不是數字比較:
?? char *name="Lupto";
??? if(!stricmp(name,"Isaac"))???
???? ?? printf("Your name means'Laughter'.\n");
??? else if(!stricmp(name,"Amy"))
???? ?? printf("Your name means'Beloved'.\n");
??? else if(!stricmp(name,"Lloyd"))
????? ? printf("Your name means'Mysterious'.\n");
??? else
????? ? printf("I haven't a clue as to what your name means.\n");

請參見:
1、switch語句必須包含default分支嗎7???
2、switch語句的最后一個分支可以不要break語句嗎?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450464.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450464.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450464.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python基礎班---第一部分(基礎)---Python基礎知識---第一個Python程序

01. 第一個 HelloPython 程序 1.1 Python 源程序的基本概念 Python 源程序就是一個特殊格式的文本文件&#xff0c;可以使用任意文本編輯軟件做 Python 的開發Python 程序的 文件擴展名 通常都是 .py1.2 演練步驟 在桌面下&#xff0c;新建 Python基礎1 目錄在 Python基礎1 目錄…

面試題-集合

1.JAVA 中數組和集合的區別 &#xff1f; &#xff08;1&#xff09;數組的長度是固定的&#xff0c;而集合長度是可以改變的。 &#xff08;2&#xff09;數組可以儲存基本數據類型和引用數據類型&#xff0c;而集合只能儲存引用數據類型&#xff08;也就是對象&#xff09;…

七牛云上傳視頻如何有效做到節省空間

在上傳視頻的時候&#xff0c;我們通常會保存到第三方【七牛云】平臺。不過大多數程序員在系統后臺上傳視頻后&#xff0c;一般都是保存到了本地&#xff0c;如果視頻非常多或者視頻容量特別大的情況下&#xff0c;那么我們的服務器遲早有一天會滿&#xff0c;為了節省空間&…

運算符的優先級總能起作用嗎?

有關運算符優先級的規則稍微有點復雜。在大多數情況下&#xff0c;這些規則確實是你所需要的&#xff0c;然而&#xff0c;有人也指出其中的一些規則本來是可以設計得更好的。讓我們快速地回顧一些有關內容&#xff1a;“運算符優先級”是這樣一些規則的集合——這些規則規定了…

按鈕交互loading ---- 轉圈圈 加載

按鈕loading狀態自定義選項&#xff08;功能&#xff09;&#xff1a; 可以在元素上添加 data-am-loading 來設置選項&#xff1a; spinner 加載動畫圖標&#xff0c;適用于支持 CSS3 動畫、非 input 元素&#xff0c;寫圖標名稱即可&#xff1b;loadingText 加載時顯示的文字&…

面試題-線程

1.什么是線程 &#xff1f;線程和進程的區別 &#xff1f; 線程是操作系統能夠進行運算調度的最小單位&#xff0c;它被包含在進程之中&#xff0c;是進程中的實際運作單位。而進程是系統中 正在運行的一個程序&#xff0c;程序一旦運行就是進程。 區別&#xff1a;&#xf…

區塊鏈入門教程

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 區塊鏈&#xff08;blockchain&#xff09;是眼下的大熱門&#xff0c;新聞媒體大量報道&#xff0c;宣稱它將創造未來。 可是&#xf…

響應式面包屑菜單

在線演示 本地下載 轉載于:https://www.cnblogs.com/qixidi/p/10064991.html

5個能提高你工作效率的Excel技巧

Excel的應用在工作中還是十分廣泛的&#xff0c;那么下面小編就來為大家分享5個Excel技巧來幫助大家輕松提高工作效率。1. 不用數據驗證或數據有效性&#xff0c;自動生成下拉列表方法&#xff1a;按【Alt↓】組合鍵注意點&#xff1a;光標要定位在已有數據區域的下一個單元格&…

很好的推薦書籍

五百本編程書籍推薦【信息化類】 書號書名作者出版時間定價對應頁碼TP02041企業資源計劃&#xff08;ERP&#xff09;教程羅鴻2006-1&#xffe5;28.00—TP02031ERP理論、方法與實踐周玉清 等2005-12&#xffe5;39.00—TP01059ERP原理設計實施&#xff08;第3版&#xff09;羅…

消息推送

我有一個運動類app軟件,它的服務器是集群式的&#xff0c;有N臺服務器。現在我想在app上開發一個功能&#xff0c;在每天的晚上11點進行消息推送&#xff0c;他會推送今天走多少步&#xff0c;是否健康&#xff0c;明天至少走多少步。請問如何11點能準時觸達到用戶&#xff1f;…

day10:函數進階

1&#xff0c;函數的命令空間&#xff08;內置命名空間&#xff0c;全局命名空間&#xff0c;局部命名空間&#xff09;&#xff0c;內置大于全局大于局部 2&#xff0c;內置命名空間&#xff0c;就是Python解釋器一啟動就可以使用的名字&#xff0c;存儲在內置命名空間中&…

mysql導入source注意點

mysql的導入導出要注意字符集&#xff0c;防止查詢亂碼&#xff01; 導入前設置字符集 set names utf8; //導入指定編碼source /xxx.sqlcommit;

嗶哩嗶哩修改視頻速度

按住f12,打開控制臺&#xff0c;先輸入 const video document.querySelector("video"); video.play() // 開始 video.pause() // 暫停 video.playbackRate3 // 三倍速

編譯預處理

C語言編譯中&#xff0c;什么時候應該使用32位編譯程序? 32位編譯程序應該在32位操作系統上使用。由32位編譯程序生成的32位程序比16位程序運行得更快&#xff0c;這正是任何32位的東西都很熱門的原因。有那么多不同版本的Microsoft Windows&#xff0c;它們和哪種編譯程序組成…

去除List集合中的重復值(四種好用的方法)

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 最近項目中需要對list集合中的重復值進行處理&#xff0c;大部分是采用兩種方法&#xff0c;一種是用遍歷list集合判斷后賦給另一個list…

jQuery---過濾選擇器

4、過濾選擇器 過濾選擇器主要是通過特定的過濾規則來篩選出所需的DOM元素&#xff0c;過濾規則與CSS 中的偽類選擇器語法相同&#xff0c;即選擇器都以一個冒號(:)開頭。按照不同的過濾規則&#xff0c; 過濾選擇器可以分為基本過濾、內容過濾、可見性過濾、屬性過濾、子元素過…

安裝Frida抓包工具

curl https://bootstrap.pypa.io/get-pip.py | python3 pip install frida pip install frida-tools

正則介紹_grep

2019獨角獸企業重金招聘Python工程師標準>>> 10月16日任務 9.1 正則介紹_grep上 9.2 grep中 9.3 grep下 grep基本用法 grep [-cinvABC] word filename centos7.x版本的grep實則為grep --colorauto-c 顯示匹配到的行數[rootlocalhost ~]# cp /etc/passwd /tmp [rootl…

[國家集訓隊]middle

嘟嘟嘟 有誰能想到這題會用到主席樹呢&#xff1f;&#xff08;不愧是WJMZBMR出的題&#xff09; 首先考慮如果區間是固定的話&#xff0c;中位數該怎么求。 沒錯&#xff0c;二分。如果大于當前二分值\(mid\)的數比小于\(mid\)的數多&#xff0c;說明\(mid\)還可以再變大&…