據(jù)的運(yùn)算:C運(yùn)算符與類型轉(zhuǎn)換)
C運(yùn)算符與類型轉(zhuǎn)換寫在前面本文承接《數(shù)據(jù)的表現(xiàn)形式》繼續(xù)整理C語(yǔ)言中“數(shù)據(jù)如何參與運(yùn)算”這一部分內(nèi)容。文章從初學(xué)階段最常見的運(yùn)算符出發(fā)說明它們的基本用法、優(yōu)先級(jí)、結(jié)合性以及混合運(yùn)算中的類型轉(zhuǎn)換。部分較復(fù)雜、暫不影響后續(xù)學(xué)習(xí)的規(guī)則不在本文展開。如有錯(cuò)誤或不足煩請(qǐng)斧正。數(shù)據(jù)有了表現(xiàn)形式還要經(jīng)過運(yùn)算才能真正參與程序的處理。加減乘除只是其中最直觀的一部分比較、邏輯判斷、賦值和類型轉(zhuǎn)換同樣由運(yùn)算符完成。C語(yǔ)言中的運(yùn)算符很多。按常見教材的分類主要包括算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符、強(qiáng)制類型轉(zhuǎn)換運(yùn)算符、賦值運(yùn)算符、條件運(yùn)算符、逗號(hào)運(yùn)算符、求字節(jié)數(shù)運(yùn)算符、指針運(yùn)算符、位運(yùn)算符、成員運(yùn)算符、下標(biāo)運(yùn)算符、函數(shù)調(diào)用運(yùn)算符本文主要介紹和說明前8種運(yùn)算符。算術(shù)運(yùn)算符算術(shù)運(yùn)算符包括加號(hào) 減號(hào)- 乘號(hào)* 除號(hào)/ 求余運(yùn)算符% 自增運(yùn)算符 自減運(yùn)算符–其中加減乘號(hào)同數(shù)學(xué)。除號(hào)當(dāng)兩個(gè)運(yùn)算對(duì)象都是整數(shù)時(shí)進(jìn)行整數(shù)除法結(jié)果仍為整數(shù)若結(jié)果含有小數(shù)部分則直接向零截?cái)喽皇撬纳嵛迦?。例? / 2的結(jié)果為2-5 / 2的結(jié)果為-2。當(dāng)至少一個(gè)運(yùn)算對(duì)象是浮點(diǎn)型時(shí)系統(tǒng)會(huì)先按照通常算術(shù)轉(zhuǎn)換確定兩者的共同類型再進(jìn)行浮點(diǎn)除法。例如float型與int型相除結(jié)果類型為floatdouble型與int型相除結(jié)果類型為double。商的正負(fù)遵循數(shù)學(xué)的符號(hào)運(yùn)算規(guī)則。除數(shù)不能為0否則程序的行為未定義。求余運(yùn)算符%的兩個(gè)運(yùn)算對(duì)象必須都是整數(shù)結(jié)果也為整數(shù)。結(jié)果不為0時(shí)其符號(hào)與被除數(shù)相同。例如-5 % 2的結(jié)果為-1。除數(shù)同樣不能為0。自增運(yùn)算有i和i兩種形式。i產(chǎn)生的是i自增前的值同時(shí)使i的值加1i先使i的值加1再產(chǎn)生自增后的值。只有當(dāng)表達(dá)式的值被使用時(shí)二者的區(qū)別才會(huì)體現(xiàn)出來(lái)若單獨(dú)寫成i;或i;效果相同。#includestdio.hintmain(){intm,i1;mi;printf(%d %d,m,i);return0;}/* 輸出結(jié)果 1 2 */#includestdio.hintmain(){intn,i1;ni;printf(%d %d,n,i);return0;}/* 輸出結(jié)果 2 2 */自減運(yùn)算符同理。二元雙目算術(shù)運(yùn)算符中*、/、%的優(yōu)先級(jí)相同并且高于、-同一優(yōu)先級(jí)內(nèi)從左向右結(jié)合。自增、自減等單目運(yùn)算符的優(yōu)先級(jí)見文末匯總。關(guān)系運(yùn)算符關(guān)系運(yùn)算符有大于()、大于或等于()、小于()、小于或等于()、等于()、不等于(!)其中優(yōu)先級(jí)相同!優(yōu)先級(jí)相同前四者優(yōu)先級(jí)高于后兩者。用關(guān)系運(yùn)算符將兩個(gè)數(shù)值或數(shù)值表達(dá)式連接起來(lái)的式子稱為關(guān)系表達(dá)式。關(guān)系表達(dá)式的結(jié)果類型為int關(guān)系成立時(shí)值為1不成立時(shí)值為0。關(guān)系表達(dá)式自左向右結(jié)合。若a1,b3,c -1, 則ab的值為0ac的值為1 dabc則d的值為1,因?yàn)閍b的值為0下一步0c的值為1賦給d. 若d5,則dabc的值為0注意區(qū)分和,前者是賦值運(yùn)算符后者是等于號(hào) dabc是連接數(shù)值和關(guān)系表達(dá)式的賦值表達(dá)式最終把值賦給d dabc是關(guān)系表達(dá)式。 d a b c等價(jià)于d ((a b) c) d a b c等價(jià)于d ((a b) c)。因此C語(yǔ)言中的a b c并不表示數(shù)學(xué)中的“a b且b c”。若要表達(dá)這一含義應(yīng)寫成a b b c。邏輯運(yùn)算符邏輯運(yùn)算符按優(yōu)先級(jí)從高到低有非(!)、與()、或(||)。C語(yǔ)言在判斷條件時(shí)將0視為“假”將任何非零值視為“真”。但“非零為真”不表示非零值會(huì)自動(dòng)變成1關(guān)系運(yùn)算和邏輯運(yùn)算的結(jié)果才是int型的0或1。只有兩個(gè)運(yùn)算對(duì)象均為“真”表達(dá)式才為“真”||只要兩個(gè)運(yùn)算對(duì)象中有一個(gè)為“真”表達(dá)式就為“真”。和||都從左向右判斷并具有短路特性對(duì)于若左邊已經(jīng)為假右邊不再計(jì)算對(duì)于||若左邊已經(jīng)為真右邊不再計(jì)算。a4,則!a的值為0 表達(dá)式5420的值為1 表達(dá)式54||20的值為1 表達(dá)式54||20的值為1 表達(dá)式54||20的值為0強(qiáng)制類型轉(zhuǎn)換運(yùn)算符強(qiáng)制類型轉(zhuǎn)換運(yùn)算符可以將一個(gè)表達(dá)式的值轉(zhuǎn)換為指定類型一般形式為(類型名)表達(dá)式表達(dá)式較復(fù)雜時(shí)可以寫成(類型名)(表達(dá)式).(double)a// 將a的值轉(zhuǎn)換為double型(float)(7%3)// 將7 % 3的結(jié)果轉(zhuǎn)換為float型強(qiáng)制類型轉(zhuǎn)換會(huì)產(chǎn)生一個(gè)指定類型的轉(zhuǎn)換結(jié)果但不會(huì)因此改變?cè)兞勘旧淼念愋?。僅僅寫出(double)aa的類型和值都不會(huì)改變。類型轉(zhuǎn)換過程中可能丟失信息例如(int)3.8的結(jié)果為3。賦值運(yùn)算符將右邊的值賦給左邊的變量即存放數(shù)據(jù)符號(hào)為,結(jié)合性為自右向左。inta;a3;//將3賦給變量a除基本賦值運(yùn)算符外賦值運(yùn)算符還包括、-、*、/、%等復(fù)合賦值運(yùn)算符?;举x值會(huì)將右邊的值轉(zhuǎn)換為左側(cè)變量的類型再存入左側(cè)變量結(jié)合性為從右向左。條件運(yùn)算符一般形式為表達(dá)式1?表達(dá)式2:表達(dá)式3若表達(dá)式1為非零值只計(jì)算表達(dá)式2并將其結(jié)果作為整個(gè)條件表達(dá)式的值若表達(dá)式1為0只計(jì)算表達(dá)式3。如(ab)?x:y含義是如果ab成立則該條件表達(dá)式的值為x否則為y.逗號(hào)運(yùn)算符一般形式表達(dá)式1,表達(dá)式2,表達(dá)式3,...,表達(dá)式n各表達(dá)式按照從左向右的順序依次計(jì)算整個(gè)逗號(hào)表達(dá)式的值與最后一個(gè)表達(dá)式的值相同。inta,b,c;a1,b2,cab;//先把1賦給變量a再把2賦給變量b最后把a(bǔ)b的值賦給c//整個(gè)表達(dá)式的值也為3.注意變量聲明和函數(shù)參數(shù)列表中的逗號(hào)只是分隔符不是逗號(hào)運(yùn)算符。例如int a, b, c;中的兩個(gè)逗號(hào)都不是逗號(hào)運(yùn)算符。求字節(jié)數(shù)運(yùn)算符sizeof用于求某個(gè)表達(dá)式的類型或指定類型所占的字節(jié)數(shù)一般寫作sizeof(表達(dá)式)或sizeof(類型名)。它是運(yùn)算符不是函數(shù)結(jié)果類型為size_t。#includestdio.hintmain(void){inta;printf(%zu\n,sizeof(a));return0;}//多數(shù)情況下輸出結(jié)果為4因?yàn)槎鄶?shù)編譯系統(tǒng)給基本整型分配4字節(jié)不同數(shù)據(jù)間的混合運(yùn)算與類型轉(zhuǎn)換本文涉及的運(yùn)算符優(yōu)先級(jí)從高到低可概括為后綴自增、自減 單目運(yùn)算符與強(qiáng)制類型轉(zhuǎn)換 *、/、%、-、、、、!|| 條件運(yùn)算符 賦值運(yùn)算符 逗號(hào)運(yùn)算符。圓括號(hào)可以用來(lái)明確表達(dá)式的組合方式。優(yōu)先級(jí)和結(jié)合性決定的是表達(dá)式怎樣組合不等于各部分實(shí)際的求值順序。遇到復(fù)雜表達(dá)式時(shí)最好主動(dòng)加上括號(hào)或者將其拆成多條語(yǔ)句。同一優(yōu)先級(jí)內(nèi)本文涉及的大多數(shù)二元運(yùn)算符從左向右結(jié)合單目運(yùn)算符、條件運(yùn)算符和賦值運(yùn)算符從右向左結(jié)合。不同類型的數(shù)據(jù)一起進(jìn)行算術(shù)運(yùn)算時(shí)C語(yǔ)言通常會(huì)先把本次運(yùn)算中使用的值臨時(shí)轉(zhuǎn)換為同一種類型再進(jìn)行計(jì)算原變量的類型不會(huì)因此改變。例如int型與double型運(yùn)算時(shí)int型的值會(huì)臨時(shí)轉(zhuǎn)換為double型int型與float型運(yùn)算時(shí)int型的值會(huì)臨時(shí)轉(zhuǎn)換為float型。char、short等較小的整數(shù)類型只和整數(shù)一起運(yùn)算時(shí)通常會(huì)先轉(zhuǎn)換為int型這稱為“整數(shù)提升”。賦值或強(qiáng)制類型轉(zhuǎn)換則會(huì)把值轉(zhuǎn)換為目標(biāo)類型在這個(gè)過程中可能丟失信息。運(yùn)算符本身并不難真正容易出錯(cuò)的是把數(shù)學(xué)中的直覺直接帶進(jìn)C語(yǔ)言整數(shù)相除不會(huì)保留小數(shù)連續(xù)關(guān)系運(yùn)算不等于數(shù)學(xué)中的連寫非零代表“真”卻不一定等于1優(yōu)先級(jí)也只決定表達(dá)式如何組合。遇到稍復(fù)雜的表達(dá)式時(shí)可以先判斷運(yùn)算對(duì)象的類型再用括號(hào)明確組合方式最后分步驗(yàn)證。至此數(shù)據(jù)不再只是被存儲(chǔ)也開始真正參與計(jì)算、比較與判斷。學(xué)習(xí)路上我們常在。