C語言筆記(符號)

注釋符號

  • 幾個似非而是的注釋問題

例子:

(A) int / * ... * /i;
(B) char * s = "abcdefgh    //hijklmn";
(C) //Is it a \valid comment?
(D) in/ * ... * /t i;

我們知道C語言里可以有兩種注釋方式:“/* */” 和 “ // ”。那么上面幾條注釋是否正確。

(A)中,有人認為Bain一起剔除掉注釋后代碼會被解析成int i,所以不正確。編譯器的確會將注釋剔除,但不是簡單的剔除,而是 用空格代替原來的注釋 。 如:/* 這是*/ # /*一條*/ define /*合法的*/ ID /*預處理 */ replacement /*指*\ list /* 令*/
(B)中,我們知道雙引號引起來的都是字符串常量,那雙斜杠也不例外。
(C)中,這是一條合法的注釋,因為“\”是一條接續符。
(D)中,前面說過注釋會被空格替換,那這里也很好理解了。

  • y = x /*p
    只要斜杠(/)和星號(*)之間沒有空格,都會被當作注釋的開始,這一點一定要注意。

  • 怎么寫出出色的注釋

  • 注釋應當準確、易懂、防止有二義性。錯誤的注釋不但無益反而有害
  • 邊寫代碼邊注釋,修改代碼的同時修改相應的注釋,以保證注釋與代碼的一致性,注釋太多了會讓人眼花繚亂。
  • 一目了然的語句不加注釋。
  • 對于全局數據(全局變量、常量定義等)必須要加注釋。
  • 注釋采用英文,盡量避免在注釋中使用縮寫,特別是不常用的縮寫。
  • 注釋的位置應與被描述的代碼相鄰,可以與語句在同一行,也可以在上行,但不可放在下方。同一結構中不同域的注釋要對齊。
  • 當代碼比較長,特別是有多重嵌套時,應當在一些段落的結束處加注釋,便于閱讀。
  • 注釋的縮進要與代碼的縮進一致。
  • 注釋代碼段應注重“為何做(why)”而不是“怎么做(how)”
  • 數值的單位一定要注釋。
  • 對變量的范圍給出注釋,尤其是參數。
  • 對一系列的數字編號給出注釋,尤其在編寫底層驅動程序的時候(比如引腳編號)。
  • 對于函數的入口/出口數據、條件語句、分支語句給出注釋。
  • 避免在一行代碼或表達式的中間插入注釋。
  • 復雜的函數中,在分支語句、循環語句結束之后需要適當的注釋,方便區分各分支或循環體。
  • 對于不需要被編譯的區域要使用條件編譯來實現,例如,使用帶有注釋的 #if 或 #ifdef 結構。

接續符和轉義符

C語言里以反斜杠(\)表示斷行。編譯器會將反斜杠剔除掉,跟在后面的字符自動續接到前一行。但是注意:反斜杠之后不能有空格,反斜杠的下一行之前也不能有空格。
反斜杠除了可以被用作接續符外,還能被用做轉義字符的開始標識。常用的轉義字符以及含義如下圖:
這里寫圖片描述

單引號、雙引號

雙引號引起來的都是字符串常量,單引號引起來的都是字符常量。

邏輯運算符

“ || ”和“ && ”是我們經常用到的邏輯運算符,與按位運算符“ | ”和“ & ”是兩碼事。

int i = 0;
int j = 0;
if ((++i > 0) || (++j > 0))
{// 打印出i和j的值
}//結果: i = 1; j = 0;

不要驚訝。邏輯運算符“ || ”兩邊的條件只要有一個為真,其結果就為真;邏輯運算符“ && ”兩邊的條件只要有一個結果為假,其結果就為假。if ((++i > 0) || (++j > 0))語句中,先計算(++i > 0),發現其結果為真,后面的(++j > 0)便不再計算;同樣“&&”運算符也要注意這種情況。這是容易出錯的地方。在某些情況下,邏輯運算符可以代替if語句

int a = 3;
int b = 5;
if (a < b)
{a = b;
}
/************/
//等同于
(a < b) && (a = b);//如果前面為假,則整體為假,后面也不需要執行
//如果前面為真,還要考慮后面是否為真,繼續執行后面的式子

位運算符

C語言中位運算包括下面幾種:

&……按位與
| …….按位或
^…….按位異或
~…….取反
<<….左移
>>….右移

前四種操作很簡單,一般不會出錯。但要注意按位運算符“ | ”和 “ & ”與邏輯運算符“ || ”和 “ && ”完全是兩碼事,別混淆了。其中按位異或操作可以實現不用第3個臨時變量交換兩個變量的值: a ^=b; b ^= a; a ^= b;但并不推薦這么做,因為這樣的代碼讀起來很費勁。

  • 位操作需要用宏定義好后再使用。
//例如常用的位操作宏
#define SETBIT(x, y)   ((x) |= (y))
#define CLRBIT(x, y)   ((x) &= ~(y)) // 要十分小心y是否是有符號數
//建議不適用取反操作,而是自己計算需要的值,否則非常容易出錯
#define TOGLBIT(x, y)  ((x) ^= (y))
#define TESTBIT(x, y)  ((x) & (y))
  • 如果位操作符’~’和‘<<’ 應用于基本類型無符號字符型或無符號短整型的操作數,結果會立即轉換成操作數的基本類型。
#include <stdint.h>
#inlcude <stdio.h>
int main()
{uint8_t port = 0x5aU;uint8_t result_8;uint16_t result_16;result_8 =(~port)>>4;               //不能得到期待的0xa5result_8 =((uint8_t)(~port))>>4;            //正確的寫法result_16=((uint16_t)(~(uint16_t)port))>>4; //正確的寫法return 0;   
}
  • 位運算符不能用于基本類型(underlying type)是有符號的操作數上。
  • 一元減運算符不能用在基本類型無符號的表達式上,除非在使用之前對兩個操作數進行大小判斷,且被減數必須大于減數
  • 左移和右移

左移運算符“<<”是雙目運算符,其功能是把“<<”左邊的運算數的各二進位全部左移若干位,由“<<”右邊的數制定移動的位數,高位丟棄,地位補0.
右移運算符“>>”是雙目運算符,其功能是把“>>”左邊的運算數的各二進位全部右移若干位,由“>>”右邊的數制定移動的位數。但注意:對于有符號數,在右移時,符號位將隨同移動。當為正數時,最高位補0;而為負數時,符號位為1,最高位補0或是補1取決于編譯系統的規定。Turbo
C和很多系統規定補1.
左移和右移的位數不能大于和等于數據的長度,不能小于0.

++、- - 操作符

之前的博客里有這方面的介紹(傳送門)
貪心法:每一個符號應該包含盡可能多的字符。還需要注意的是:除了字符串和字符常量,符號的中間不能嵌有空白(空格、制表符、換行符等),比如:==是單個符號,而==是兩個等號

除法

三條性質:

  • 最重要的一點,我們希望q * b + r == a,因為這是定義余數的關系。
  • 如果我們改變 a 的正負號,希望 q 的符號也隨之改變,但 q 的絕對值不會變。
  • 當 b > 0 時,我們希望保證r >= 0 且 r < b .

但是他們不能同時成立。大多數編程語言選擇了放棄第3條,而改為要求余數與被除數的正負號相同,這樣性質1和性質2就可以得到滿足。大多數 C 語言編譯器也都是如此。

運算符的優先級

這里寫圖片描述

記憶技巧:
① 偽運算符的優先級最高,單目運算符優先級總是高于雙目;
② 對于雙目運算符而言,算術運算>位運算>邏輯運算;
③ 自右向左結合的運算符只有單目運算符和賦值運算符。

2 一些容易出錯的優先級問題,見下表。
這里寫圖片描述

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

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

相關文章

直線行駛

考核要求 保證跟車安全速度和安全距離&#xff0c;了解車輛行駛速度、注意觀察路面狀況&#xff0c;采取相應措施。不能有左右擺動、方向不穩的現象。 考試口訣 一.尋找中心 二.雙眼鎖定本車能通行的中心 三.心理想著走中間 四.雙眼從本車前面最突出點的.中心…

java 命令: jmap 命令使用 ( 查看內存使用、設置 )

jdk安裝后會自帶一些小工具&#xff0c;jmap命令(Java Memory Map)是其中之一。主要用于打印指定Java進程(或核心文件、遠程調試服務器)的共享對象內存映射或堆內存細節。 jmap命令可以獲得運行中的jvm的堆的快照&#xff0c;從而可以離線分析堆&#xff0c;以檢查內存泄漏&am…

第一節 接口概述 [轉貼]

接口&#xff08;interface&#xff09;用來定義一種程序的協定。實現接口的類或者結構要與接口的定義嚴格一致。有了這個協定&#xff0c;就可以拋開編程語言的限制&#xff08;理論上&#xff09;。接口可以從多個基接口繼承&#xff0c;而類或結構可以實現多個接口。接口可以…

獲取本機用戶名、MAC地址、IP地址、硬盤ID、CPU序列號、系統名稱、物理內存

我們在利用C#開發桌面程序&#xff08;Winform&#xff09;程序的時候&#xff0c;經常需要獲取一些跟系統相關的信息&#xff0c;例如用戶名、MAC地址、IP地址、硬盤ID、CPU序列號、系統名稱、物理內存等。 首先需要引入命名空間&#xff1a; using System.Management; //…

只用一套解決方案,就可解決80%的交通物流行業信息難題

行業背景 新中國成立70多年來&#xff0c;中國交通運輸總體上已經形成了多節點、全覆蓋的綜合運輸網絡&#xff0c;“五縱五橫”綜合運輸大通道基本貫通&#xff0c;一大批綜合客運、貨運樞紐站場&#xff08;物流園區&#xff09;投入運營&#xff0c;取得了一系列矚目成果&am…

起步

什么是開車起步 起步&#xff0c;即發動汽車&#xff0c;使汽車開始走動。 操作方法 1、“踩”離合器 2、“掛”一檔 3、“打”左轉向燈&#xff08;提醒后車駕駛員注意安全避讓&#xff09; 4、“鳴”號&#xff08;引起車輛周圍的行人或機動車等注意&…

Linux 使用 jstat 命令查看 jvm 的 GC 情況

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Options&#xff0c;選項&#xff0c;我們一般使用 -gcutil 查看gc情況 vmid&#xff0c;VM的進程號&#xff0c;即當前運行的java進程號…

WKWebview加載本地圖片時出現路徑問題

出現問題情況是&#xff1a;將uiwebview換成wkwebview之后&#xff0c;之前將webview上那些圖片放回本地下載后緩存的圖片沒辦法在webview上找到&#xff0c;最后排查出原因是&#xff0c;wkwebview需要將圖片和網頁文件放在同個路徑下。 具體實現方法如下(獲取圖片緩存的路徑&…

上車準備

上車準備一 1、環視車輛、確保安全。 2、調整駕駛座。身體坐正&#xff0c;雙手向前伸直&#xff0c;以手腕剛好能放在方向盤上為準。左腳擱在離合器上&#xff0c;右腳擱在剎車上&#xff0c;小腿和大腿成90度。左腳可以輕松把離合器踩到底。身體離方向盤20—25厘米。 …

C++復習

register關鍵字請求“編譯器”將局部變量存儲于寄存器中 C語言中無法取得register變量地址 在C中依然支持register關鍵字 1、C編譯器有自己的優化方式&#xff0c;不使用register也可能做優化 2、C中可以取得register變量的地址 C編譯器發現程序中需要取register變量的地址…

Docker 方式安裝 Nginx 、阿里云服務器上裝 Ngnix

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 非 Docker 方式安裝&#xff0c;直接 Linux 安裝見另一文&#xff1a;Linux 上 安裝 nginx 、阿里云服務器上安裝 nginx 1. 直接從鏡像倉…

C#實現A*算法

理解A*尋路算法具體過程 這兩天研究了下 A* 尋路算法, 主要學習了這篇文章, 但這篇翻譯得不是很好, 我花了很久才看明白文章中的各種指代. 特寫此篇博客用來總結, 并寫了尋路算法的代碼, 覺得有用的同學可以看看. 另外因為圖片制作起來比較麻煩, 所以我用的是原文里的圖片. 當…

路考口訣

路考口訣一 一踩&#xff08;踩離合&#xff09;、二掛&#xff08;掛一檔&#xff09;、三看&#xff08;看倒車鏡&#xff09;、四轉&#xff08;轉向燈&#xff09;、五按&#xff08;按喇叭&#xff09;、六手剎、七走 路考口訣二 01.路考之道很輕松&#xff0c;牢…

nfs服務器工作原理

https://www.cnblogs.com/me80/p/7464125.html轉載于:https://www.cnblogs.com/huhuxixi/p/11203049.html

玩轉數據結構——均攤復雜度和防止復雜度的震蕩(筆記)

數據規模 時間復雜度 并不是所有的雙層循環都是O&#xff08;n^2&#xff09;的 復雜度實驗來確定復雜度 // O(N) 兩倍增加 int findMax( int arr[], int n ){assert( n > 0 );int res arr[0];for( int i 1 ; i < n ; i )if( arr[i] > res )res arr[i];return res…

解決:bash: vim: command not found、docker 容器不識別 vi / vim 、docker 容器中安裝 vim

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 在 Docker 容器中編輯文件&#xff0c;報錯如下&#xff1a; bash: vim: command not found2. 安裝 vim &#xff1a; apt-get in…

路考

路考基本項目組成 路考即是科目三&#xff0c;是新增加的一個考試項目&#xff0c;基本項目有13項&#xff0c;包括上車準備、起步、直線行駛、變更車道、通過路口、靠邊停車、通過人行橫道線、通過學校區域、通過公共汽車站、會車、超車、掉頭、夜間行駛。 上車準備 …

OpenDDS通訊rtps_discovery對等發現模式的pub和sub匹配的日志

OpenDDS的通訊體系中&#xff0c;提供了豐富的日志輸出&#xff0c;通過日志輸出可以清晰的看到pub和sub方的主題匹配的過程&#xff0c;是加深對OpenDDS過程了解的一個好方法。 下面的日志&#xff0c;以OpenDDS3.8為基礎&#xff0c;增加了部分日志和時間戳輸出。 rtps_dis…

Developing Web Applications with Apache, MySQL, memcached, and Perl

Developing Web Applications with Apache, MySQL, memcached, and Perl轉載于:https://www.cnblogs.com/gavinhughhu/archive/2009/11/02/1594290.html

awk 中 {print $1} 什么意思

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 舉個例子 echo "aa bb cc" | awk -F {print $1} 結果就是aa&#xff0c;意思是把字符串按空格分割&#xff0c;取第一個。aw…