您好,登錄后才能下訂單哦!
這篇文章主要介紹C語言三大語句注意事項(xiàng)有哪些,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
在今天的內(nèi)容介紹之前我們要知道:C語言中,由一個(gè)分號( ; )隔開的就是一條語句。
很好理解,如:
int a=3;//語句1 printf("請大家多多指教!");//語句2 ;//語句3----空語句
今天講解的內(nèi)容,則是自己對于這三種語句一些細(xì)節(jié)的介紹。(并不是具體講解這些語句)
分支語句:if,switch
循環(huán)語句:while,for,do while
goto語句
補(bǔ)充小知識(后面如果遇見,可在此了解)
C語言中:0 表示假--------非0 表示真,如:1,2,-1
EOF: EOF是一個(gè)計(jì)算機(jī)術(shù)語,為End Of File的縮寫(文件結(jié)束標(biāo)志),其值為-1。通常在文本的最后存在此字符表示資料結(jié)束。
getchar():(來源于MSDN,大家可以自己翻譯一下哦 \(^ ^)/ )
Read a character from a stream (getc, getwc), or get a character from stdin (getchar, getwchar).
Return Value
Each of these functions returns the character read. To indicate an read error or end-of-file condition, getc and getchar return EOF. For getc and getchar, use ferror or feof to check for an error or for end of file.(個(gè)人理解:如果正確讀取,返回的是對應(yīng)字符的ASCII碼值,如果讀取失敗/結(jié)束/錯(cuò)誤,返回的是EOF)
getchar返回類型為int。(因?yàn)樗祷氐目赡苁茿SCII碼值,或者是EOF(-1))
scanf()在讀取字符時(shí)會跳過空格、制表符和換行符(這里不作詳細(xì)介紹啦,后面會有專門章節(jié)介紹)
system()——執(zhí)行系統(tǒng)命令的一個(gè)函數(shù)——來自頭文件<stdlib.h>
shutdown -s——關(guān)機(jī)命令、
shutdown -s -t time
——在time
秒后自動關(guān)機(jī)、shutdown -a
——取消關(guān)機(jī)如果要讓程序?qū)嵭?0s內(nèi)關(guān)機(jī):system("shutdown -s -t 60");
strcmp:比較字符串大小的函數(shù)。如果要比較字符串A和B的大小,代碼如下:
strcmp(A,B);
如果返回值=0,則兩個(gè)字符串相等;如果返回值>0,則A字符串長度大于B;如果返回值<0,則A字符串長度小于B
分支語句其實(shí)就是一種選擇結(jié)構(gòu)。對于要先做判斷再選擇的問題就要使用分支語句。
比如:如果你喜歡我的文章,可以給我點(diǎn)贊收藏;要是不喜歡的話,可以給我一些改進(jìn)的建議。甚至你 以有其他很多的選擇,這都是分支語句的一部分。
C語言中使用選擇結(jié)構(gòu),就要用到:
if
、switch
if
和else
后面如果有多條語句,要加大括號{ }
代碼如下:【期待如果age<=18
,輸出未成年;age>18
,輸出成年了 可以戀愛啦!】
int age=24; if(a>18) printf("未成年"); else printf("成年了"); printf("可以戀愛啦!")
這段代碼結(jié)果:成年了 可以戀愛啦!
但是如果讓age=8
的話,輸出結(jié)果是:未成年 可以戀愛啦! 這并不符合我們的需求
所以需要將else
后面這兩個(gè)語句用{ }括起來。
懸空else: else 與離他最近的 未匹配的if 匹配
代碼如下:(大家可以思考一下答案是什么)
int a=0; int b=2; if(a==1) if(b==2) printf("hehe\n"); else printf("haha\n");
大家想到了嗎,其實(shí)這道題根本不會打印結(jié)果。
這道題不僅要我們知道,else與離他最近的if匹配;還要我們注意代碼的書寫風(fēng)格是很重要的
這里推薦一本有關(guān)代碼風(fēng)格的書《高質(zhì)量的C-C++編程》,大家可以找到電子版的進(jìn)行學(xué)習(xí)。
switch語句常常用于多分支情況
對于如:
輸入1,輸出周一
輸入2,輸出周二
…
輸入6,輸出周六
輸入7,輸出周日
如果用if…else if…else if…else的形式則顯得復(fù)雜,這時(shí)用switch是一個(gè)更好的選擇
switch(整形表達(dá)式) { case 整形常量表達(dá)式: 語句; }
注意:
switch后面是整形表達(dá)式(比如int型,char型)【可以用字符,因?yàn)樽址鋵?shí)是整型的一種,底層存儲的是字符對應(yīng)的ASCII值】case后面是整形常量表達(dá)式(比如1,1+2)
但是如果是下面的代碼,可以對應(yīng)數(shù)字輸出星期幾嗎?大家可以思考一下
int day=0; scanf("%d",&day); switch(day) { case 1: printf("Mon\n"); case 2: printf("Tue\n"); case 3: printf("Wed\n"); case 4: printf("Thus\n"); case 5: printf("Fri\n"); case 6: printf("Sat\n"); case 7: printf("Sun\n"); }
答案是,如果我輸入1,則會輸出所有的星期。因?yàn)槲逸斎氲闹凳且粋€(gè)入口,如果我輸入2,則從case2進(jìn)入, 但是好像沒有出口去使語句停止下來,故會一直往后輸出,直到switch結(jié)束。
故這個(gè)時(shí)候,搭配break,才能使switch實(shí)現(xiàn)真正的分支。
但是break并不是一定要加的,根據(jù)需求添加,如以下代碼(根據(jù)數(shù)字打印工作日和休息日)
int day=0; scanf("%d",&day); switch(day) { case 1: case 2: case 3: case 4: case 5: printf("工作日\n"); break; case 6: case 7: printf("休息日\n"); break;//可以省略,不過建議加上 //default: // printf("輸入錯(cuò)誤"); //break; }
再提一下default
。如果不加default
,如上面的代碼。如果輸出不是1到7的數(shù)字,則不會打印任何東西就結(jié) 束。但是你可以加一個(gè)default,如果輸入的不符合上面要求,則顯示輸入錯(cuò)誤,可以提醒一下自己。(根據(jù) 需求)
至于default
的位置,可以不在最后面,只要其他的需求符合題意,放在其他位置也行。
最后可以通過一段代碼檢驗(yàn)大家是否好的理解了switch
:
int n=1; int m=2; switch(n) { case 1:m++; case 2:n++; case 3: switch(n) {//switch允許嵌套使用 case 1: n++; case 2: m++; n++; break; } case 4: m++; break; default: break; } printf("m=%d,n=%d\n",m,n);
如果你的答案是 5,3,那表示你理解了。如果不是的話,可以對照上面關(guān)于switch再好好琢磨一下哦。
循環(huán)語句:一組被重復(fù)執(zhí)行的語句稱之為循環(huán)體,能否繼續(xù)重復(fù),決定循環(huán)的終止條件。循環(huán)結(jié)構(gòu)是在 一定條件下反復(fù)執(zhí)行某段程序的流程結(jié)構(gòu),被反復(fù)執(zhí)行的程序被稱為循環(huán)體。循環(huán)語句是由 循環(huán)體及循環(huán)的終止條件兩部分組成的。
C語言中使用循環(huán)結(jié)構(gòu)就要用到:
while
、for
、do while
在while循環(huán)中,break用于永久的終止循環(huán)(for,do while都適用)
代碼如下:
int i=1; while(i<=10) { if(i==5) break; printf("%d ",i); i++; }
結(jié)果輸出:1 2 3 4
在
while
循環(huán)中,continue
是跳過本次循環(huán)continue
后面的代碼,直接去判斷部分(for,do while都適用)
大家可以思考一下,下面的代碼輸出什么:
int i=1; while(i<=10) { if(i==5) continue; printf("%d ",i); i++; }
結(jié)果輸出:1 2 3 4 后面死循環(huán),因?yàn)楫?dāng)i=5時(shí),就跳過了continue后面的語句,i不能自增,但是會再次進(jìn)入 循環(huán)判斷。
while( ( ch = getchar( ) ) != EOF )
(在鍵盤上按住Ctrl+z其實(shí)就是讓getchar()讀到了EOF,讀取就結(jié)束)
大家可以自己先調(diào)試運(yùn)行一下下面的代碼:
int ch=0; while((ch=getchar())!=EOF) { putchar(ch);//輸出字符 }
結(jié)果就是,如果你輸入A回車,界面就會打印A,然后換行顯示輸入光標(biāo),當(dāng)你在輸入其他字符時(shí)回車后,也 是打印字符,回車,直到你Ctrl+z回車后,該循環(huán)才結(jié)束。
但是你知道
getchar
是怎么讀入數(shù)據(jù)的嗎?了解getchar()是如何讀取東西:(
getchar
和鍵盤之間有個(gè)緩沖區(qū),并不是直接從鍵盤拿數(shù)據(jù))
getchar
是讀取一個(gè)字符輸入前緩沖區(qū)是空的,
getchar
就等待輸入如果你輸入 A回車,即將A\n放入緩沖區(qū)中,
getchar
先讀到A,A就進(jìn)入ch中,然后打印,再次循環(huán)時(shí)再讀到\n,\n進(jìn)入ch中,進(jìn)行回車。故后面再輸入時(shí),就換了一行。
了解了getchar
的讀入原理后,下面有一段代碼,其實(shí)有個(gè)錯(cuò)誤,大家可以想想怎樣修改:
char password[20] = { 0 }; printf("請輸入密碼>:"); scanf("%s", password); printf("請確認(rèn)密碼(Y/N)>:"); int ch = getchar(); if ('Y' == ch) { printf("確認(rèn)成功\n"); } else { printf("確認(rèn)失敗\n"); }
假設(shè)密碼是123456,當(dāng)我們回車后。首先scanf
讀入123456,但是剩下的\n就被getchar接收了。
解決方案1:可以在這之前加一個(gè)getchar(),
接收\n,以清理緩沖區(qū)。
但是如果這樣做后,我們?nèi)绻斎朊艽a為12345 abcde,依舊會產(chǎn)生問題。
所以怎么辦呢?增加getchar()的數(shù)量嗎,那我們是不是可以用一個(gè)循環(huán),直到getchar讀入的為\n為止結(jié)束。 當(dāng)我們再做確認(rèn)的時(shí)候,ch就可以成功接收字符。代碼如下:
char password[20] = { 0 }; printf("請輸入密碼>:"); scanf("%s", password); printf("請確認(rèn)密碼(Y/N)>:"); int tmp = 0; while ((tmp = getchar()) != '\n') { ; } int ch = getchar(); if ('Y' == ch) { printf("確認(rèn)成功\n"); } else { printf("確認(rèn)失敗\n"); }
到這里大家應(yīng)該已經(jīng)清楚getchar
的讀入了,至于以上的密碼接收有點(diǎn)問題,這里只是形象的舉個(gè)例子,大家要是想的太多了,不用去糾結(jié)的。
這里我有時(shí)老出現(xiàn)一個(gè)錯(cuò)誤,故自己提出來。先大家先看以下的一段代碼:(感覺一下是否有問題)
do { int input=0; printf("請選擇:>"); scanf("%d", &input); switch (input) { case 0: break; case 1: break; default: break; } } while (input);
我第一次寫出這種代碼時(shí),編譯就顯示有錯(cuò)誤,但我自己感覺很合理。因?yàn)楸疽馐窍胼斎?,就退出循環(huán);輸入其他的數(shù)字,就可以循環(huán)下去。
如果細(xì)心的話,大家就會發(fā)現(xiàn),input
的定義其實(shí)應(yīng)該在do-while
循環(huán)的外面。我當(dāng)時(shí)就費(fèi)解了一會,但是聯(lián)想到while
循環(huán),就感覺這一切都說的通了。
像我這種情況,判斷定義的變量,應(yīng)該與循環(huán)在一個(gè)等級,就是在循環(huán)語句之外,就定義好。
語法結(jié)構(gòu):
for(表達(dá)式1;表達(dá)式2;表示式3)
循環(huán)體
注意:
圓括號內(nèi)的三個(gè)表達(dá)式在語法上都可以省,但兩個(gè)分號“ ;”不可以省。for( ; ; )可以表示無限循環(huán)。
因?yàn)檎Z法規(guī)定,判斷部分省略表示真。
goto語句:也稱為無條件轉(zhuǎn)移語句。其一般格式如:goto 語句標(biāo)號; 其中語句標(biāo)號是按[標(biāo)識符]規(guī)定書 寫的符號, 放在某一語句行的前面,標(biāo)號后加[半角冒號]“:”。語句標(biāo)號起標(biāo)識語句的作用, 與 goto 語句配合使用。
用法: goto 語句通常與條件語句配合使用??捎脕韺?shí)現(xiàn)條件轉(zhuǎn)移, 構(gòu)成循環(huán),跳出循環(huán)體等功能。
注意: 1. 使用goto語句只能goto到同一函數(shù)內(nèi),而不能從一個(gè)函數(shù)里goto到另外一個(gè)函數(shù)里。2.在結(jié)構(gòu)化程序設(shè)計(jì)
中一般不主張使用 goto 語句, 以免造成程序流程的混亂,使理解和調(diào)試程序都產(chǎn)生困難。
語句格式:
goto 語句標(biāo)號: ... 語句標(biāo)號:語句//----語句標(biāo)號也可以在goto語句之前
可以通過下面兩段代碼比較,幫你理解:
int i=5; if(i==5) { goto start: } //代碼1 start: printf("A\n"); printf("B\n"); printf("C\n"); //代碼2 printf("A\n"); printf("B\n"); start: printf("C\n");
代碼1輸出A B C,而代碼2,直接跳過A B,只輸出C。
goto語句可以用于跳出多層循環(huán),代碼如下:
for() { for() { for() { goto start; } } } start: 表達(dá)式
故goto最常見的用法是:終止程序在某些深度嵌套的結(jié)構(gòu)的處理過程。
最后給大家寫一個(gè)《關(guān)機(jī)程序》來幫大家理解goto語句,希望大家喜歡啦\(^ ^)/
#include <stdio.h> int main() { char input[10] = {0}; system("shutdown -s -t 60"); again: printf("電腦將在1分鐘內(nèi)關(guān)機(jī),如果輸入:俺很喜歡這篇文章,就取消關(guān)機(jī)!\n請輸入:>"); scanf("%s", input); if(0 == strcmp(input, "我是豬")) { system("shutdown -a"); } else { goto again; } return 0; }
以上是“C語言三大語句注意事項(xiàng)有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。