C語言從零開始(七)-其他運(yùn)算符

一,關(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é)果:

運(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é)果為:

運(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最低)

  1. ()(小括號(hào)) [](數(shù)組下標(biāo)) .(結(jié)構(gòu)成員) ->(指針型結(jié)構(gòu)成員)
  2. !(邏輯非) .(位取反) -(負(fù)號(hào)) ++(加1) --(減1) &(變量地址)
  3. *(指針?biāo)竷?nèi)容) type(函數(shù)說明) sizeof(長(zhǎng)度計(jì)算)
  4. *(乘) /(除) %(取模)
  5. +(加) -(減)
  6. <<(位左移) >>(位右移)
  7. <(小于) <=(小于等于) >(大于) >=(大于等于)
  8. ==(等于) !=(不等于)
  9. &(位與)
  10. ^(位異或)
  11. |(位或)
  12. &&(邏輯與)
  13. ||(邏輯或)
  14. ?:(?表達(dá)式)
  15. = += -=(聯(lián)合操作)
  16. ,(逗號(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)輸入輸出

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末帚桩,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子巫糙,更是在濱河造成了極大的恐慌朗儒,老刑警劉巖颊乘,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件参淹,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡乏悄,警方通過查閱死者的電腦和手機(jī)浙值,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來檩小,“玉大人开呐,你說我怎么就攤上這事」媲螅” “怎么了筐付?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)阻肿。 經(jīng)常有香客問我瓦戚,道長(zhǎng),這世上最難降的妖魔是什么丛塌? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任较解,我火速辦了婚禮,結(jié)果婚禮上赴邻,老公的妹妹穿的比我還像新娘印衔。我一直安慰自己,他們只是感情好姥敛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布奸焙。 她就那樣靜靜地躺著,像睡著了一般彤敛。 火紅的嫁衣襯著肌膚如雪与帆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天臊泌,我揣著相機(jī)與錄音鲤桥,去河邊找鬼。 笑死渠概,一個(gè)胖子當(dāng)著我的面吹牛茶凳,可吹牛的內(nèi)容都是我干的嫂拴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼贮喧,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼筒狠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起箱沦,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤辩恼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后谓形,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體灶伊,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年寒跳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了聘萨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡童太,死狀恐怖米辐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情书释,我是刑警寧澤翘贮,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站爆惧,受9級(jí)特大地震影響狸页,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜检激,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一肴捉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧叔收,春花似錦齿穗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至复濒,卻和暖如春脖卖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背巧颈。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工畦木, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人砸泛。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓十籍,卻偏偏與公主長(zhǎng)得像蛆封,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子勾栗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 表達(dá)式和運(yùn)算符 程序中最簡(jiǎn)單的表達(dá)式就是惨篱,程序中的常量 變量名也是一種簡(jiǎn)單的表達(dá)式 復(fù)雜的表達(dá)式是由簡(jiǎn)單的表達(dá)式組...
    zhaolion閱讀 1,633評(píng)論 3 12
  • 本章將會(huì)介紹 模塊和源文件訪問級(jí)別訪問控制語法自定義類型子類常量砸讳、變量、屬性界牡、下標(biāo)構(gòu)造器協(xié)議擴(kuò)展泛型類型別名位運(yùn)算...
    寒橋閱讀 883評(píng)論 0 2
  • 關(guān)于 Swift 重要這個(gè)文檔所包含的準(zhǔn)備信息, 是關(guān)于開發(fā)的 API 和技術(shù)的簿寂。這個(gè)信息可能會(huì)改變, 根據(jù)這個(gè)文...
    無灃閱讀 4,301評(píng)論 1 27
  • 第十天 03-對(duì)象模型-第04天{創(chuàng)建結(jié)構(gòu)} 第十天節(jié)點(diǎn)操作克隆節(jié)點(diǎn) - cloneNode()添加節(jié)點(diǎn) - ap...
    believedream閱讀 446評(píng)論 0 0
  • 到了大一的第二學(xué)期了,課程變多了欢揖!考試也多了陶耍!特別忙但是毫無頭緒! 2017.4.9 全國(guó)大學(xué)生英語競(jìng)賽 2017...
    La凱瑟琳閱讀 350評(píng)論 1 1