一,關(guān)系運(yùn)算符
1. 關(guān)系運(yùn)算符
關(guān)系運(yùn)算符的作用是比較符號(hào)兩邊的元素
> 大于
>= 大于等于
< 小于
<= 小于等于
== 等于
!= 不等于
關(guān)系運(yùn)算符都是雙目運(yùn)算符萌壳,其結(jié)合性均為左結(jié)合。關(guān)系運(yùn)算符的優(yōu)先級(jí)低于算術(shù)運(yùn)算符日月,高于賦值運(yùn)算符袱瓮。也就是說,在一個(gè)沒有括號(hào)的關(guān)系運(yùn)算表達(dá)式中爱咬,<尺借、<=、>精拟、>=要先于==和!=發(fā)揮作用燎斩。相同級(jí)別的預(yù)算符從左向右計(jì)算。
2. 關(guān)系表達(dá)式
關(guān)系表達(dá)式的一般形式為:
表達(dá)式 關(guān)系運(yùn)算符 表達(dá)式
例如:
a + b > c - d
x > 3 / 2
‘a(chǎn)’ + 1 < c
-i - 5 * j == k + 1
也允許出現(xiàn)嵌套的情況蜂绎。
例如:
a > (b > c)
a != (c == d)
關(guān)系表達(dá)式的值是“真”和“假”栅表,用“1”和“0”表示。如:
5 > 0的值為“真”师枣,即為1怪瓶;
(a = 3) > (b = 5)由于不成立,故其值為假践美,即為0洗贰。
例如:
#include <stdio.h>
int main(){
char c = 'k';
int i = 1, j = 2, k = 3;
float x = 3e + 5, y = 0.85;
printf("%d, %d\n", 'a' + 5 < c, -i - 2 * j >= k + 1);
printf("%d, %d\n", 1 < j < 5, x - 5.25 <= x + y);
printf("%d, %d\n", i + j + k == -2 * j, k == j == i + 5);
return 0;
}
- 字符變量以它對(duì)應(yīng)的ASCII碼參與運(yùn)算
- 對(duì)于含多個(gè)關(guān)系運(yùn)算符的表達(dá)式,如k == j == i + 5陨倡,根據(jù)運(yùn)算符的左結(jié)合性敛滋,先計(jì)算k == j,該式不成立玫膀,其值為0矛缨,再計(jì)算0 == i + 5,也不成立帖旨,故表達(dá)式值為0箕昭。
是不是有點(diǎn)暈,如果你要參加考試解阅,請(qǐng)仔細(xì)研究一下落竹。如果你只是為了能自己寫出好的程序,不用搞懂這么多货抄,值需要知道:
表達(dá)式為真述召,值為1。表達(dá)式為假蟹地,值為0
需要注意的是积暖,C語言中經(jīng)常用0代表假,非零代表真怪与。遇到了我們?cè)僬f夺刑。
二,邏輯運(yùn)算符
邏輯運(yùn)算符相當(dāng)于數(shù)學(xué)中的(且分别、或遍愿、非),我們叫做“邏輯與”耘斩、“邏輯或”和“邏輯非”沼填。
&& 邏輯與
|| 邏輯或
! 邏輯非
前兩個(gè)是雙目運(yùn)算符,最后一個(gè)是單目預(yù)算符括授。
我們看一段代碼:
int main()
{
int a = 5 > 3; // 表示真
int b = 5 < 3; // 表示假
int x = a && a;
int y = a && b;
int z = b && b;
printf("x = %d, y = %d, z = %d\n", x, y, z);
x = a || a;
y = a || b;
z = b || b;
printf("x = %d, y = %d, z = %d\n", x, y, z);
x = !a;
y = !b;
z = !(!a);
printf("x = %d, y = %d, z = %d\n", x, y, z);
return 0;
}
先看下這段代碼的運(yùn)行結(jié)果:
簡(jiǎn)單說就是這樣:
邏輯與:兩邊都為真時(shí)返回真坞笙,否則返回假;
邏輯或:只要任意一個(gè)為真就返回真荚虚,否則返回假薛夜;
邏輯非:符號(hào)右邊是真,則返回假曲管;符號(hào)右邊是假却邓,則返回真。
請(qǐng)仔細(xì)對(duì)照程序理解院水。
三腊徙,按位運(yùn)算符
C語言和其它高級(jí)語言不同的是它完全支持按位運(yùn)算符。這與匯編語言的位操作有些相似檬某。
按位運(yùn)算符有:
& 位邏輯與
| 位邏輯或
^ 位邏輯異或
- 位邏輯反
>> 右移
<< 左移
這部分涉及一點(diǎn)點(diǎn)匯編語言知識(shí)撬腾,不具體介紹了。有問題的同學(xué)可以私下討論恢恼。
需要說幾個(gè)特殊的應(yīng)用民傻。
1. 不申請(qǐng)第三個(gè)變量數(shù)值交換
這個(gè)問題經(jīng)常在面試中考,就是如何在不使用第三個(gè)變量的情況下完成兩個(gè)變量的數(shù)值交換±焯撸看這段代碼:
int a = 1;
int b = 2;
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("a = %d, b = %d\n", a, b);
大家自己去驗(yàn)證一下結(jié)果牵署。
2. 最高效的乘2和除2
int a = 10;
int b = a * 2;
int c = a / 2;
printf("b = %d, c = %d\n", b, c);
這段代碼大家肯定能看懂,但它還有另外一種效率更高的表達(dá)方式:
int a = 10;
int b = a << 1;
int c = a >> 1;
printf("b = %d, c = %d\n", b, c);
因?yàn)槲贿\(yùn)算得到了更多的底層優(yōu)化喧半,因此同樣的功能它的效率更高奴迅。在嵌入式開發(fā)中,這種方式是被人們推崇的挺据,因?yàn)橘Y源有限取具。其他領(lǐng)域,人們更多地還是使用前面的方法扁耐,因?yàn)榇a可讀性更佳暇检。
說遠(yuǎn)了,這些大家了解就好婉称。
四. 特殊運(yùn)算符
1. "?"運(yùn)算符
"?"運(yùn)算符是一個(gè)三目運(yùn)算符, 其一般形式是:
<表達(dá)式1>?<表達(dá)式2>:<表達(dá)式3>;
含義:
先求表達(dá)式1的值,如果為真,則求表達(dá)式2 的值并把它作為整個(gè)表達(dá)式的值;如果表達(dá)式1的值為假,則求表達(dá)式3的值并把它作為整個(gè)表達(dá)式的值块仆。
請(qǐng)看下面這段代碼:
int main()
{
int x, y, z;
x = 50;
y = x > 70 ? 100 : 0;
printf("y = %d\n", y);
x = 80;
z = x > 70 ? 100 :0;
printf("z = %d\n", z);
return 0;
}
運(yùn)行結(jié)果為:
仔細(xì)思考一下這個(gè)例子。后面我們會(huì)講到的if ... else ... 的部分功能可以用這個(gè)表達(dá)式替代酿矢。
2. ","運(yùn)算符
","運(yùn)算符用于將多個(gè)表達(dá)式串在一起, ","運(yùn)算符的左邊總不返回,右邊表達(dá)式的值才是整個(gè)表達(dá)式的值榨乎。
舉個(gè)例子:
int main()
{
int x, y;
x = 50;
y = (x -= 5, x / 5);
printf("%d", y);
return 0;
}
這段代碼的打印結(jié)果是9. 因?yàn)閤的初始值為50, 減5后變?yōu)?5, 45除5為9賦給y。
這個(gè)知識(shí)點(diǎn)常被忽略瘫筐,所以被各種考試青睞蜜暑。其實(shí)在真正編程中很少使用。
3. sizeof運(yùn)算符
sizeof運(yùn)算符是一個(gè)單目運(yùn)算符, 它返回變量或類型的字節(jié)長(zhǎng)度策肝。
例如:
sizeof(double) // 8
sizeof(int) // 2
也可以求變量的大小, 例如:
float f;
int a = sizeof(f);
則a的值將為4肛捍。
這個(gè)預(yù)算付可以理解為一個(gè)函數(shù),在計(jì)算結(jié)構(gòu)體大小時(shí)很有用之众。后面會(huì)講到拙毫。
五,C運(yùn)算符的優(yōu)先級(jí)
當(dāng)一個(gè)表達(dá)式中有多個(gè)運(yùn)算符參加運(yùn)算時(shí),將按下表所規(guī)定的優(yōu)先級(jí)進(jìn)行運(yùn)算棺禾。表中優(yōu)先級(jí)從上往下逐漸降低,同一行優(yōu)先級(jí)相同缀蹄。
C運(yùn)算符的優(yōu)先次序(1最高, 16最低)
- ()(小括號(hào)) [](數(shù)組下標(biāo)) .(結(jié)構(gòu)成員) ->(指針型結(jié)構(gòu)成員)
- !(邏輯非) .(位取反) -(負(fù)號(hào)) ++(加1) --(減1) &(變量地址)
- *(指針?biāo)竷?nèi)容) type(函數(shù)說明) sizeof(長(zhǎng)度計(jì)算)
- *(乘) /(除) %(取模)
- +(加) -(減)
- <<(位左移) >>(位右移)
- <(小于) <=(小于等于) >(大于) >=(大于等于)
- ==(等于) !=(不等于)
- &(位與)
- ^(位異或)
- |(位或)
- &&(邏輯與)
- ||(邏輯或)
- ?:(?表達(dá)式)
- = += -=(聯(lián)合操作)
- ,(逗號(hào)運(yùn)算符)
這個(gè)部分教材上有大量練習(xí)題,請(qǐng)大家去練習(xí)一下膘婶。尤其是準(zhǔn)備考等級(jí)考試的同學(xué)缺前。
今天就到這里。其實(shí)這部分如果細(xì)說還有很多小點(diǎn)悬襟,我們這里主要抓取大的脈絡(luò)衅码,具體還需要大家學(xué)習(xí)教材,有什么問題歡迎探討脊岳。
我是天花板逝段,讓我們一起在軟件開發(fā)中自我迭代垛玻。
如有任何問題,歡迎與我聯(lián)系奶躯。
上一篇:C語言從零開始(六)-運(yùn)算符與類型轉(zhuǎn)換
下一篇:C語言從零開始(八)-標(biāo)準(zhǔn)輸入輸出