目錄
第一部分、常見操作符
第二部分、每個操作符的具體使用????????
1、算術操作符
1.1、除法運算符 /?
1.2、取模運算符 %
2、移位操作符
2.1、左移?<<
2.2、右移 >>
?3、位操作符
3.1、按位異或的妙用
3.2、按位與的妙用
4、單目操作符
4.1、邏輯反操作符 !
?4.2、sizeof操作符
?4.3、按位取反~
4.4、強制類型轉換
5、三目操作符(條件操作符)
6、逗號表達式
第三部分、往期文章
第一部分、常見操作符
? ? ? 操作符類型 | 相應的操作符 |
算術操作符 | 加+????????減-????????乘*?? ? ? ?除/????????取模% |
移位操作符 | 左移<<? ? ? ? 右移>> |
位操作符 | 按位與&????????按位或|????????按位異或^ |
復合賦值操作符 |
加等于+=? ? ?減等于-=? ? ? ?乘等于*=? ? ? ?模等于/=? ? ?余等于%=? ? ?按位與&=??????? 按位異或等于^=???????按位或等于|=? ? ? ??右移等于>>=???????左移等于<<= |
單目操作符(只有一個操作數) |
邏輯取反操作!? ? ? ? 取地址&? ? ? ? 計算操作數的類型長度sizeof? ? ? ? 按位取反~ 前置、后置++????????前置、后置--????????解引用操作符(間接訪問)*????????? 強制類型轉換(類型)X? ?地(X為變量或者指針) |
關系操作符 | 大于>? ? ? ? 大于等于>=????????小于<???????? 小于等于<=????????等于等于==????????不等于!= |
?邏輯操作符 | 邏輯與&&? ? ? ? 邏輯或|| |
條件操作符(三目操作符) | exp1 ? exp2 : exp3 |
逗號表達式 | 從左往右執(zhí)行exp1,exp2,exp3,exp4 |
下標引用、函數調用和結構成員 | 下標引用[]????????函數調用()? ? ? ? 訪問結構成員.?????????指針訪問結構體成員-> |
第二部分、每個操作符的具體使用????????
? ? ? ? 這里主要記錄一些使用這些操作符的基本知識,有些太簡單,我就不沒有記錄。
1、算術操作符
1.1、除法運算符 /?
????????如果除號兩邊都是整數執(zhí)行的是整數除法,如果被除數與除數之間有一個是小數,那么計算結果就是小數。示例如下:
1.2、取模運算符 %
????????% 操作符的兩個操作數必須為整數。返回的是整除之后的余數。
2、移位操作符
? ? ? ? 注意:移位操作符的操作數只能是整數。
2.1、左移?<<
????????向左移位,右邊永遠補0。(小技巧:對于偶數,左移1位等價于除以2,因此在FPGA內部便可用左移的方式代替除法,減少邏輯資源的使用。)
2.2、右移 >>
? ? ? ? 當操作數為正數時:向右移位,左邊補0。
? ? ? ? 當操作時為負數時:分為兩種情況:(取決于編譯器)
方式一、邏輯移位:左邊用0填充,右邊丟棄(包括符號位)
方式二、算術移位:左邊用該值的符號位填充,右邊丟棄(一般情況下是算數右移)
驗證編譯器的移位方式,示例如下:
? ? ? ? 因為a = -1,其在內存中的存儲方式為:11111111_11111111_11111111_11111111,根據算術移位,其值不發(fā)生改變。
? ? ? ? 如果該編譯器的右移方式為邏輯移位時:01111111_11111111_11111111_11111111,該值為一個很大的正數。
?3、位操作符
? ? ? ? 合理的使用位操作符,得到的代碼可太妙了。其次注意:位操作符的操作數也為整數。
3.1、按位異或的妙用
? ? ? ? 示例、不定義中間變量的方式,實現兩個整數 a,b值之間的互換。
int a = 3,b =5;
//按位異或的方式
a = a ^ b;
b = a ^ b;//b = a^b^b
a = a ^ b;//a = a^b^a
//相加的方式,容易溢出
a = a + b;//8(缺點,a,b值太大時容易溢出)
b = a - b;//8 - 5 = 3
a = a - b;//8 - 3 = 5
3.2、按位與的妙用
? ? ? ? 示例、求一個整數存儲在內存中的二進制中1的個數。
方法1、常規(guī)思路
int main()
{
int a = -1;
int count = 0;
for (int i = 0;i < 32; i++)
{
if (a & (1<<i))//注意這里的寫法,不用去定義一個變量讓他去移位
{
count++;
}
}
printf("%d\n", count);
return 0;
}
方法2、大佬思路
int main()
{
int num = -1;
int i = 0;
int count = 0;//計數
while (num)
{
count++;
num = num & (num - 1);//num 與 num - 1 相與
}
printf("二進制中1的個數 = %d\n", count);
return 0;
}
4、單目操作符
4.1、邏輯反操作符 !
????????注意:C語言中,0就是假,非0就為真。 a = 100 ;!a = 0;
?4.2、sizeof操作符
? ? ? ? sizeof的作用:以字節(jié)為單位給出與變量或類型在內存中所占的空間大小。
? ? ? ? 注意:1.?sizeof計算字符串的時候會算入\0。
? ? ? ? ? ? ? ? ? ?2. sizeof括號內部的表達式是不參與運算的!結果只有a的類型決定,定義a的時候已經給a開辟了空間。
如下圖:
? ? ? ? ?關于sizeof的用法還是很多的,例如下面兩張截圖展示的內容。
例如1、計算不同類型變量所占空間大小
例如2、用來計算整型數組的長度(會常用?。。。?/strong>
? ? ? ? 數組長度再進行傳參的時候,只能在外部提前計算好數組的長度,隨后再進行傳參。
?4.3、按位取反~
? ? ? ? 對某個數取反,是將其在內存中的二進制數據(補碼)進行按位取反。
? ? ? ? 這里為啥是-1?應該懂了吧。
4.4、強制類型轉換
? ? ? ? 變量前面右括號,括號里面還有類型,那么就是強制類型轉換。
(數據類型)變量?
- 強制類型的正常用法?
- 強制類型的更妙的用法(涉及到后面的指針的一些知識)
?????????void* :示任何類表型的地址都可以放進去。無論是char*,int*還是其他指針類型,都可以用void*來存放。
? ? ? ? 用通俗的話來說,void* 就是指針類型變量的垃圾桶,可以存放任何類型變量的地址。
? ? ? ? 因此,利用這一點,就有了一個應用場景,在編寫函數的入口參數時,我不知道傳入該函數的參數是什么指針類型,那么此時我先用void*來存放該指針,等我函數里面要用到該指針的時候我再去進行強制類型轉換。妙的壓批!
5、三目操作符(條件操作符)
? ? ? ? 說實話,我個人認為該操作符在C語言里面經常被人遺忘,也可能是我接觸的C太少。但是這個操作符在verilog HDL里面可是一個寵兒,大寵兒。
? ? ? ? 在verilog里面和assign賦值語句一起用,能夠解決輸出結果存在一個周期延遲的問題。這里不探討太多,后面關于verilog 中如何使用,我會詳細解釋。
exp1 ?exp2 :exp3;
exp1成立,整個表達式返回exp2的值,如果exp1不成立,整個表達式返回exp3的值。
6、逗號表達式
????????逗號表達式,就是用逗號隔開的多個表達式。
????????逗號表達式,從左向右依次執(zhí)行。整個表達式的結果是最后一個表達式的結果。
示例如下:用來簡化代碼。
int main()
{
a = get_val();
count_val(a);
while (a > 0)
{
a = get_val();
count_val(a);
}
return 0;
}
//等價于
int main()
{
while (a = get_val(), count_val(a),a > 0)
{
}
return 0;
}
第三部分、往期文章
? ? ? ? 希望我的筆記對你有幫助,有需要的小伙伴可以看一下往期的文章??????
????????【C語言復習】第一篇、關于我的C語言的復習路線_大屁桃的博客-CSDN博客
????????【C語言復習】第二篇、VS2017軟件的使用以及常用小技巧_大屁桃的博客-CSDN博客?
????????【C語言復習】第三篇、Gitee碼云的創(chuàng)建和使用_大屁桃的博客-CSDN博客
????????【C語言復習】第四篇、有關C語言數據類型的知識_大屁桃的博客-CSDN博客
? ? ? ?【C語言復習】第五篇、變量,常量,字符串,轉義字符的知識_大屁桃的博客-CSDN博客文章來源:http://www.zghlxwxcb.cn/news/detail-502945.html
? ? ? ??文章來源地址http://www.zghlxwxcb.cn/news/detail-502945.html
到了這里,關于【C語言復習】第六篇、關于C語言操作符的知識的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!