c語言操作符概要

2021-08-18 05:22:42 字數 4589 閱讀 5700

算術操作符

在c語言中有兩個單目和五個雙目運算子。符號 功能

+. 單目正 - 單目負 * 乘法 / 除法 % 取模 + 加法 - 減法

下面是一些賦值語句的例子, 在賦值運算子右側的表示式中就使用了上面的算術運算子:

area=height*width;

num=num1+num2/num3-num4;

運算子也有個運算順序問題,先算乘除再算加減。單目正和單目負最先運算。

取模運算子(%)用於計算兩個整數相除所得的餘數。例如:

a=7%4;

最終a的結果是3,因為7%4的餘數是3。

b=7/4;

這樣b就是它們的商了,應該是1。這裡需要說明的是,當兩個整數相除時,所得到的結果仍然是整數,沒有小數部分。要想也得到小數部分,可以這樣寫7.0/4或者7/4.0,也即把其中乙個數變為非整數。

那麼怎樣由乙個實數得到它的整數部分呢?這就需要用強制型別轉換了。例如:

a=(int) (7.0/4);

因為7.0/4的值為1.75,如果在前面加上(int)就表示把結果強制轉換成整型,這就得到了1。

單目減運算子相當於取相反值,若是正值就變為負值,若是負數就變為正值。

單目加運算子沒有意義,純粹是和單目減構成一對用的。

移位操作符

**<

:右移操作符—-分為邏輯移位和算術移位**

(1)算術移位:左邊丟棄,右邊補符號位。(相當於除2)

(2)邏輯移位:右邊丟棄,左邊補0。

位操作符

& :按位與 |:按位或 ^:按位異或

按位與規則:有0為0,全1為1。

按位或規則:有1為1,全0為0。

按位異或規則:相同為假,相異為真。

賦值運算子

賦值語句的作用是把某個常量或變數或表示式的值賦值給另乙個變數。符號為『=』。這裡並不是等於的意思,只是賦值,等於用『==』表示。

得已賦值的變數我們稱為左值,因為它們出現在賦值語句的左邊;產生值的表示式我們稱為右值,因為她它們出現在賦值語句的右邊。常數只能作為右值。

例如:

count=5;

total1=total2=0;

第乙個賦值語句大家都能理解。

第二個賦值語句的意思是把0同時賦值給兩個變數。這是因為賦值語句是從右向左運算的,也就是說從右端開始計算。這樣它先total2=0;然後total1=total2;

(total1=total2)=0;

這樣是不可以的,因為先要算括號裡面的,這時total1=total2是乙個表示式,而賦值語句的左邊是不允許表示式存在的。

邏輯運算子

邏輯運算子是根據表示式的值來返回真值或是假值。其實在c語言中沒有所謂的真值和假值,只是認為非0為真值,0為假值。符號 功能:

&& 邏輯與 || 邏輯或 ! 邏輯非

例如:

5!3; 0||-2&&5; !4;

當表示式進行&&運算時,只要有乙個為假,總的表示式就為假,只有當所有都為真時,總的式子才為真。

當表示式進行||運算時,只要有乙個為真,總的值就為真,只有當所有的都為假時,總的式子才為假。

邏輯非(!)運算是把相應的變數資料轉換為相應的真/假值。若原先為假,則邏輯非以後為真,若原先為真,則邏輯非以後為假。

還有一點很重要,當乙個邏輯表示式的前一部分的取值會直接影響整個表示式的值時,後一部分就不會進行運算了。例如:

a=2,b=1;

a||b-1;

因為a=2,為真值,所以不管b-1是不是真值,總的表示式一定為真值,這時後面的表示式就不會再計算了。

關係運算子

關係運算子是對兩個表示式進行比較,返回乙個真/假值。

符號 功能

> 大於 < 小於 >= 大於等於 <= 小於等於 == 等於 != 不等於

這些運算子大家都能明白,主要問題就是等於==和賦值=的區別了。

一些剛開始學習c語言的人總是對這兩個運算子弄不明白,經常在一些簡單問題上出錯,自己檢查時還找不出來。看下面的**:

if(amount=123) ……

很多新人都理解為如果amount等於123,就怎麼樣。其實這行**的意思是先賦值amount=123,然後判斷這個表示式是不是真值,因為結果為 123,是真值,那麼就做後面的。如果想讓當amount等於123才執行時,應該if(amount==123) ,或者直接寫為if(123==amount)……

單目操作符

**!:邏輯反操作 & :取位址 sizeof:運算元的型別長度(以位元組為單位)

~:對乙個數的二進位制按位取反 - -:前置,後置- - ++:前置,後置++

:解引用操作符 (型別):強制型別轉換*

其中,sizeof和陣列

sizeof(變數名)——–求變數的大小

sizeof(陣列名)——-陣列名表示整個陣列,求陣列總大小

sizeof(&陣列名)——陣列名表示整個陣列,取出的是整個陣列的位址

自增運算子++和自減運算子–對變數的操作結果是增加1和減少1。例如:

–couter; couter–;

++amount; amount++;

看這些例子裡,運算子在前面還是在後面對本身的影響都是一樣的,都是加1或者減1,但是當把他們作為其他表示式的一部分,兩者就有區別了。

運算子放在變數前面,那麼在運算之前,變數先完成自增或自減運算;

如果運算子放在後面,那麼自增自減運算是在變數參加表示式的運算後再運算。看下面的例子:

num1=4;

num2=8;

a=++num1;

b=num2++;

a =++num1;這總的來看是乙個賦值,把++num1的值賦給a,因為自增運算子在變數的前面,所以num1先自增加1變為5,然後賦值給a,最終a也為5。

b=num2++;這是把num2++的值賦給b,因為自增運算子在變數的後面,所以先把num2賦值給b,b應該為8,然後num2自增加1變為 9。

那麼如果出現這樣的情況我們怎麼處理呢?

c=num1+++num2;

到底是c=(num1++)+num2;還是c=num1+(++num2);這要根據編譯器來決定,不同的編譯器可能有不同的結果。所以我們在以後的程式設計當中,應該盡量避免出現上面複雜的情況。

復合賦值運算子

在賦值運算子當中,還有一類c/c++獨有的復合賦值運算子。它們實際上是一種縮寫形式,使得對變數的改變更為簡潔。

total=total+3;

乍一看這行**,似乎有問題,這是不可能成立的。其實還是老樣子,』=』是賦值不是等於。它的意思

是本身的值加3,然後在賦值給本身。為了簡化,上面的**也可以寫成:

total+=3;

復合賦值運算子有下列這些:

符號 功能

+= 加法賦值 -= 減法賦值 *= 乘法賦值 /= 除法賦值 %= 模運算賦值 <<= 左移賦值 >>= 右移賦值 &= 位邏輯與賦值 |= 位邏輯或賦值 ^= 位邏輯異或賦值

那麼看了上面的復合賦值運算子,有人就會問,到底total=total+3;與total+=3;有沒有區別?答案是有的,對於a=a+1,表示式a被計算了兩次,對於復合運算子a+=1,表示式a僅計算了一次。一般的來說,這種區別對於程式的執行沒有多大影響,但是當表示式作為函式的返回值時,函式就被呼叫了兩次,而且如果使用普通的賦值運算子,也會加大程式的開銷,使效率降低。

條件運算子

條件運算子(?:)是c語言中唯一的乙個三目運算子,它是對第乙個表示式作真/假檢測,然後根據結果返回兩外兩個表示式中的乙個。

《表示式1>?《表示式2>:《表示式3>

在運算中,首先對第乙個表示式進行檢驗,如果為真,則返回表示式2的值;如果為假,則返回表示式3的值。

例如:

a=(b>0)?b:-b;

當b>0時,a=b;當b不大於0時,a=-b;這就是條件表示式。其實上面的意思就是把b的絕對值賦值給a。

逗號運算子

在c語言中,多個表示式可以用逗號分開,其中用逗號分開的表示式的值分別結算,但整個表示式的值是最後乙個表示式的值。

假設b=2,c=7,d=5,

a1=(++b,c–,d+3);

a2=++b,c–,d+3;

對於第一行**,有三個表示式,用逗號分開,所以最終的值應該是最後乙個表示式的值,也就是d+3,為8,所以a=8。對於第二行**,那麼也是有三個表示式,這時的三個表示式為a2=++b、c–、d+3,(這是因為賦值運算子比逗號運算子優先順序高)所以最終表示式的值雖然也為8,但a2=3。

下標引用,函式呼叫和結構成員

【】:下標引用

運算元:乙個陣列名+乙個索引值

{}:函式呼叫

接受乙個或多個運算元

**. 結構體.成員名

-> 結構體指標->成員名**

賦值操作符概要

乙個類預設有乙個賦值函式,類似這樣的 classtype operator const classtype 這個賦值函式也就是乙個簡單的 操作符的過載形式,當你要將乙個物件賦值給另乙個物件時呼叫 有關賦值函式,有以下概要問題 以string類為例 class string 1.錯誤的定義形式 str...

c語言操作符 位操作符 移位操作符

1 按位操作符 1.1 按位 與 雙目運算子 僅當兩個運算元都為1時,結果為1,否則為0。參與運算的數以補碼方式出現。例 9 5 1 0000 1001 9的補碼 0000 0101 5的補碼 0000 0001 1的補碼 應用 a 通常將某些位清零或保留某些位。例如 將a的高八位清零,保留低八位,...

C語言 , 操作符

例如 define to string s s 將會使編譯器把以下命令 cout to string hello world endl 理解為cout hello world endl 例如 define concatenate x,y x y int xy 10 將會使編譯器把 cout conc...