go不是c語言的關鍵字,goto才是是c語言的關鍵字。goto語句被稱為無條件轉移語句,允許把控制無條件轉移到同一函數(shù)內的被標記的語句;語法“goto label;…label: statement;”,其中l(wèi)abel可以是任何除C關鍵字以外的純文本,它可以設置在C程序中goto語句的前面或者后面。
本教程操作環(huán)境:windows7系統(tǒng)、c99版本、Dell G3電腦。
C語言中一共有32個關鍵字:
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|
if | else | switch | case | default | break | return | goto |
do | while | for | continue | typedef | struct | enum | union |
char | short | int | long | float | double | void | sizeof |
signed | unsigned | const | auto | register | static | extern | volatile |
可以看出go不是c語言的關鍵字,goto才是是c語言的關鍵字。
c語言 goto語句
goto語句,在C中又被稱為無條件轉移語句,說是無條件,其實還是有條件的,跳轉范圍還是有限制的,允許把控制無條件轉移到同一函數(shù)內的被標記的語句。
語法
C 語言中 goto 語句的語法:
goto label; .. . label: statement;
在這里,label 可以是任何除 C 關鍵字以外的純文本,它可以設置在 C 程序中 goto 語句的前面或者后面。
流程圖
用法
首先,我們要確定好我們要轉移去的地方,也就是轉移終點,需要我們去設置一個標識符,也就是label(我沒有在秀英語,當goto語句出錯的時候,報錯內容很有可能會出現(xiàn)這個單詞),同時,我們要在label后面加一個冒號(:),就這樣,我們設置好了標識符,接下來我們設置起點——goto 標識符;。首先我們要告訴計算機,我們要跳了,就是goto的作用,接著我們要告訴他我們要跳去哪里,也就是我們剛剛設置好的標識符,最后像是其他語句一樣,我們給它加上分號(;),意味著語句結束。下面是編輯器頁面的樣子。
以及運行結果
可見,我們第5行printf沒有執(zhí)行,直接就來到了第7行printf。
它可以跳到后面語句,也可以跳到前面。
這樣他就成了一個簡便的循環(huán),沒有結束條件
大家可以試試跑一下這段代碼,當然我們可以用計數(shù)器加if判斷,給他一個結束條件,讓他擁有for和while的能力。
可惜的是我們沒辦法跨函數(shù)運用goto,有其他語句可以實現(xiàn),我們在此不再贅述。
在這里,如果if條件成立,我們在將它輸出之后,望著下面長長的一串層次不齊的中括號,我知道我要在他們那里設置條件,然后一遍又一遍的break,想想就煩,這時候不用goto更待何時?很快??!我們直接一個goto,跳到了
去進行我們下一階段的程序。
但是不知你是否注意到,我們在上一張圖片中,用了兩個goto,卻讓他們指到了同一個label,是的,我們可以在不同的起點去讓程序跳轉到同一個終點,但是要注意的是我們不可以在同一個goto下跳到兩個label,這很容易理解,換做是你,收到命令,叫你去兩個甚至多個不同的地方,你也會懵逼,我到底該去哪。
另一個與之前不同的地方就是,我在標識符xiayige:的后面加上了一個分號(;),這是為什么?標識符的后面要跟一條語句才行,可以是賦值可以是聲明,但是如果實在沒有辦法在他后面加語句,我們可以加一個分號,當作空語句,來讓這個標識符運行起來。
Ps:其實可以在這里聲明一個垃圾變量,或者別的什么無意義的語句,但會使代碼變得不易懂,并不建議這么去做。
這是大家用goto做的最多的事,至于有什么其他的用法,那就要看你的想象力了,老話說得好,人有多大膽,地有多大產。
以下是我用到goto的時候。
#include<stdio.h> int main () { printf("請輸入要計算的算式,四則運算優(yōu)先級一樣高,從左到右依次計算n"); int jieguo=0,sz,gongju=0,gongju2=1; char ysf; scanf("%d",&jieguo); if (jieguo==0) //直接輸入等號的話%d似乎是0,有待商榷?。。。。。。。?//二次修改,if語句中判斷量時只有0為假,除此之外的數(shù)字都表真 { printf("**,你算**呢n"); goto chaojijieshu; gongju=1; gongju2=0; } else if (gongju2) { printf("請輸入運算符n"); scanf(" %c",&ysf); //enter包含兩個命令,算是兩個字符r和n,后面的一個會占據scanf的輸入位,所以要清空,或者用空格占位 if(ysf=='=') printf("**,你算**呢n"); } loop: while(ysf!='=') { if (ysf=='-') { printf("請輸入數(shù)字n"); scanf("%d",&sz); jieguo-=sz; printf("請輸入運算符n"); fflush(stdin);//清空標準輸入流(stdin) fflush是stdio.h中的函數(shù) scanf("%c",&ysf); if(ysf=='=') { goto jieshu; } else { goto loop; } } else if (ysf=='+') { printf("請輸入數(shù)字n"); scanf("%d",&sz); jieguo+=sz; printf("請輸入運算符n"); fflush(stdin);//清空標準輸入流(stdin) fflush是stdio.h中的函數(shù) scanf("%c",&ysf); if(ysf=='=') { goto jieshu; } else { goto loop; } } else if(ysf=='*') { printf("請輸入數(shù)字n"); scanf("%d",&sz); jieguo*=sz; printf("請輸入運算符n"); fflush(stdin);//清空標準輸入流(stdin) fflush是stdio.h中的函數(shù) scanf("%c",&ysf); if(ysf=='=') { goto jieshu; } else { goto loop; } } else if(ysf=='/') { printf("請輸入數(shù)字n"); scanf("%d",&sz); while(sz==0) { printf("0能做分母嗎?你算**呢n"); } jieguo/=sz; printf("請輸入運算符n"); fflush(stdin);//清空標準輸入流(stdin) fflush是stdio.h中的函數(shù) scanf("%c",&ysf); if(ysf=='=') { goto jieshu; } else { goto loop; } } } jieshu: printf("結果是%dn",jieguo); chaojijieshu: if (gongju) printf("真無語,重開吧n"); return 0; } //注意注意?。。。。。。。。。。?! //enter算是兩個命令,所以有兩個字符,在進行上一次輸入之后 //在來一個enter,會占據scanf的字符位 //所以要清空標準輸入流 //可以利用下述語句 //fflush(stdin); //清空標準輸入流(stdin) fflush是stdio.h中的函數(shù) //以上是最好的解決辦法 //初次之外,還有被稱作偏方的辦法 //二次修改 除此之外,而不是初次之外,打錯字了 //如 //scanf(“ %c”,&ysf”) //在scanf中加一個空格,可以頂?shù)鬳nter多出來的一個字符 //還有 //加一句 //getchar() //用getchar來捕捉多出來的n