日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言基础回顾 —— 其他知识点

發布時間:2023/12/10 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言基础回顾 —— 其他知识点 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

參考:c語言基礎回顧 —— 其他知識點
作者:丶PURSUING
發布時間: 2021-03-11 14:48:59
網址:https://blog.csdn.net/weixin_44742824/article/details/114666007

本文為學習筆記,結合課程內容以及下列文章

printf 里的 a++,++a,真的有鬼!!
參考:原文鏈接
作者:seino_m

目錄

  • 變量命名規范
    • 駝峰命名法
  • switch case 一般用法示例
  • typedef關鍵字
  • 形式參數的作用域及生存周期
  • 左/右結合性:從左 / 右開始執行運算
  • printf 里的 a++,++a,真的有鬼!!
    • 但都放在printf中,要注意了
  • 做嵌入式軟件你必須要掌握的volatile
  • 循環結構中break、continue、return和exit的區別
    • break
    • continue
    • return
    • exit()函數

變量命名規范

①以字母,數字,下劃線組成,第一個字符不能是數字。
②不能與關鍵字一樣。
③不能包含空格,標點符號。

常見關鍵字:

陌生解釋:

keywordusage
auto聲明自動變量
const聲明只讀變量
enum聲明枚舉類型
goto無條件跳轉語句
register聲明寄存器變量
volatile說明變量在程序執行中可被隱含地改變
union聲明共用體類型

自動變量即為局部變量。變量調用時自動為其分配空間,調用結束后回收。

駝峰命名法

switch case 一般用法示例

輸入有效分數為1~100,判定所處的等級。

#include <stdio.h>int main() {int score;while(1){printf("請輸入分數\n");scanf("%d",&score);if(score == 100){printf("滿分\n");}else{switch(score/10){case 0:case 1:case 2:case 3:case 4:case 5:printf("不及格\n");break;case 6:case 7:printf("良\n");break;case 8:case 9:printf("優秀\n");break;default:printf("無效成績\n");break;}}}return 0; }

typedef關鍵字

typedef 為 C 語言的關鍵字,作用是 為一種數據類型定義一個新名字。比如人們常常使用 typedef 來編寫更美觀和可讀的代碼。所謂美觀,意指 typedef 能隱藏笨拙的語法構造以及平臺相關的數據類型,從而 增強可移植性以及未來的可維護性。

這里的數據類型包括內部數據類型(int,char等)和自定義的數據類型(struct 等)。 在編程中使用typedef 目的一般有兩個,一個是給現有數據類型一個易記且意義明確的新名字,另一個是簡化一些比較復雜的類型聲明。

注意:typedef 并不創建新的類型,它僅僅為現有類型起一個新名字。

typedef 與 define 區別:
宏定義只是簡單的字符串代換,是在預處理完成的,而typedef 是在編譯時處理的,它不是作簡單的代換,而是對類型說明符重新命名。被命名的標識符具有類型定義說明的功能。


形式參數的作用域及生存周期

作用域:僅限該函數,局部變量有自己的內存空間。

空間的生存期:函數調用時,才申請了該內存空間,才有了這個變量,同時把實際參數的值拷貝一份給形式參數,函數執行結束后釋放空間。

左/右結合性:從左 / 右開始執行運算

例如:

①算數運算符具有左結合性:x-y+z,先執行減法后加法

②賦值運算符具有右結合性:x=y=z,先執行y=z,再x=y.

printf 里的 a++,++a,真的有鬼!!

  • a++:先執行表達式后再自增,執行表達式時使用的是 a的原值。
int a = 5printf("%d",a++);
  • 1
  • 2

結果:輸出是5,a的真值是6

5
  • 1
  • ++a:先自增再執行表達示,執行表達式時使用的是 自增后的a
int a = 5printf("%d",++a);
  • 1
  • 2

結果:輸出是6,a的真值是6

6
  • 1

但都放在printf中,要注意了

#include <stdio.h>int main() {int a = 5;//5 5 7 printf("a的值是:%d,a++的值是:%d,++a的值是:%d\n",a,a++,++a) ;return 0; }

如果你認為程序輸出的是 5 5 7

說明你不了解printf的入棧與出棧:而這結果還與編譯器有關:

使用gcc編譯器

pi@raspberrypi:~/Desktop $ ./a.out a的值是:7,a++的值是:5,++a的值是:7
  • 1
  • 2

使用啊哈C

a的值是:7,a++的值是:6,++a的值是:7 請按任意鍵繼續. . .
  • 1
  • 2

從printf的入棧與出棧角度分析:

1、入棧如同往彈夾壓子彈,先入棧的算式漸漸被壓往棧的高位,后入棧的在低位
2、入棧的同時進行計算,出棧時直接輸出不計算
3、出棧時,在低位的先出棧

按照這篇文章所述,適用的應該是類似于啊哈C這些編譯器,gcc并不適用(經過嘗試是與下面兩條剛好相反)

(大部分編譯器是從右向左的)
出棧時,在低位的先出棧

而適用的是:

入棧的同時進行計算,出棧時直接輸出不計算
有副本則輸出副本,無副本輸出現在的真值

由于目前是與編譯器相關,暫不深究。

做嵌入式軟件你必須要掌握的volatile

指針章節也有講到。

volatile是一個特征修飾符(type specifier).volatile的作用是作為指令關鍵字,確保本條指令不會因編譯器的優化而省略,且要求每次直接讀值。

簡單地說就是防止編譯器對代碼進行優化。比如如下程序:

XBYTE[2]=0x55; XBYTE[2]=0x56; XBYTE[2]=0x57; XBYTE[2]=0x58;

對外部硬件而言,上述四條語句分別表示不同的操作,會產生四種不同的動作,但是編譯器卻會對上述四條語句進行優化,認為只有XBYTE[2]=0x58(即忽略前三條語句,只產生一條機器代碼)。如果鍵入volatile,則編譯器會逐一地進行編譯并產生相應的機器代碼(產生四條代碼)。

循環結構中break、continue、return和exit的區別

參考:循環結構中break、continue、return和exit的區別
地址:https://blog.csdn.net/hunanchenxingyu/article/details/8101795?utm_source=app&app_version=5.1.1&code=app_1562916241&uLinkId=usr1mkqgl919blen

break

break語句的使用場合主要是switch語句和循環結構。在循環結構中使用break語句,如果執行了break語句,那么就退出循環,接著執行循環結構下面的第一條語句。如果在多重嵌套循環中使用break語句,當執行break語句的時候,退出的是它所在的循環結構,對外層循環沒有任何影響。如果循環結構里有switch語句,并且在switch語句中使用了break語句,當執行switch語句中的break語句時,僅退出switch語句,不會退出外面的循環結構。通過圖3-17,讀者可以很直觀地了解break語句的使用。

continue

continue語句是這5種結束循環的方式中最特殊的,因為它并沒有真的退出循環,而是只結束本次循環體的執行,所以在使用continue的時候要注意這一點。圖3-18為各種循環結構中continue語句的使用。

在for循環中,首先執行表達式1(注意表達式1在整個循環中僅執行一次),接著執行表達式2,如果滿足條件,那么執行循環體,如果在循環體中執行了continue語句,那么就跳轉到表達式3處執行,接下進行下一次循環,執行表達式2,看是否滿足條件;在while循環中,如果執行了continue語句,那么就直接跳轉到表達式處,開始下一次的循環判斷;在do while循環體中如果執行了continue語句,那么就跳轉到表達式處進行下一次的循環判斷,這一點前面已經驗證過了。

return

如果在程序中遇到return語句,那么代碼就退出該函數的執行,返回到函數的調用處,如果是main()函數,那么結束整個程序的運行。圖3-20為return語句的使用。


如果是在自定義的函數中執行,那么執行return之后就返回到函數的調用處繼續往下執行。

exit()函數

exit()函數與return語句的最大區別在于,調用exit()函數將會結束當前進程,同時刪除子進程所占用的內存空間,把返回信息傳給父進程。當exit()中的參數為0時,表示正常退出,其他返回值表示非正常退出,執行exit()函數意味著進程結束;而return僅表示調用堆棧的返回,其作用是返回函數值,并且退出當前執行的函數體,返回到函數的調用處,在main()函數中, return n和exit(n)是等價的。圖3-21為exit()函數的使用。

接下來通過兩段代碼對return語句和exit()函數進行簡單的對比,先來看return語句的使用。

#include <stdio.h> #include <stdlib.h> int print() { int n; n = 0; printf("使用return來結束循環\n"); while(1) { if(9==n) return n; n++; } return 0; } void main(void) { int ret; printf("調用print()函數之前\n"); ret = print(); printf("print()函數的返回值ret=%d\n",ret); printf("調用print()函數之后\n"); return ; }

運行結果:

調用print()函數之前 使用return來結束循環 print()函數的返回值ret=9 調用print()函數之后


在上面的代碼中,用return語句來退出while死循環,在main()函數中print()函數的調用處將返回值賦給ret,打印輸出后可以看到使用return語句成功地返回了9。

下面來看exit()函數的使用。

#include <stdio.h> #include <stdlib.h> void print() { int n; n = 0; printf("使用exit來結束循環\n"); while(1) { if(9==n) exit(1); n++; } return ; } void main(void) { int ret; printf("調用print()函數之前\n"); print(); printf("調用print()函數之后\n"); return ; }

運行結果:

調用print()函數之前 使用exit來結束循環

從以上代碼可以看出,如果執行exit()函數后能夠返回到main()函數的調用處,那么可以打印出接下來的信息“調用print()函數之后”,但是運行結果表明在調用exit()函數之后沒有任何輸出,所以執行exit()函數之后將直接結束整個程序的運行。

總結

以上是生活随笔為你收集整理的c语言基础回顾 —— 其他知识点的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。