C++(二):運算子與運算式,運算子運算式

來源:互聯網
上載者:User

C++(二):運算子與運算式,運算子運算式

C++的運算子

C++的運算子十分豐富,使得C++的運算十分靈活方便。例如把賦值號(=)也作為運算子處理,這樣,a=b=c=4就是合法的運算式,這是與其他語言不同的。C++提供了以下運算子:

  1. 算術運算子
    +(加)  -(減)  *(乘)  /(除)  %(整除求餘)  ++(自加)  --(自減)
  2. 關係運算子
    >(大於)  <(小於)   ==(等於)  >=(大於或等於)  <=(小於或等於)  !=(不等於)
  3. 邏輯運算子
    &&(邏輯與)  ||(邏輯或)   !(邏輯非)
  4. 位元運算符
    <<(按位左移)  >>(按位右移)  &(按位與)  |(按位或)   ^(按位異或)  ~(按位取反)
  5. 賦值運算子 (=及其擴充賦值運算子)
  6. 條件運算子 (?:)
  7. 逗號運算子 (,)
  8. 指標運算子 (*)
  9. 引用運算子和地址運算子 (&)
  10. 求位元組數運算子(sizeof)
  11. 強制類型轉換運算子( (類型) 或類型( ))
  12. 成員運算子 (.)
  13. 指向成員的運算子 (->)
  14. 下標運算子 ([ ])
  15. 其他 (如函數調用運算子())
C++算術運算子與算術運算式基本的算術運算子在本章中主要介紹算術運算子與算術運算式,賦值運算子與賦值運算式,逗號運算子與逗號運算式,其他運算子將在以後各章中陸續介紹。

常見算數運算子
運算子 說明 舉例
+ 加法運算子,或正值運算子 3+5,+3
- 減法運算子,或負值運算子 5-2,-3
* 乘法運算子 3*5
/ 除法運算子 5/3
% 模運算子,或稱求餘運算子 %兩側均應為整型資料,如7%4的值為3

需要說明,兩個整數相除的結果為整數,如5/3的結果值為1,捨去小數部分。但是,如果除數或被除數中有一個為負值,則舍入的方向是不固定的。例如,-5/3在有的C++系統上得到結果-1,有的C++系統則給出結果-2。多數編譯系統採取“向零取整”的方法,即5/3的值等於1,-5/3的值等於-1,取整後向零靠攏。

如果參加+,  -,  *, / 運算的兩個數中有一個數為float型資料,則運算的結果是double型,因為C++在運算時對所有float型資料都按double型資料處理。
算術運算式和運算子的優先順序與結合性用算術運算子和括弧將運算對象(也稱運算元)串連起來的、符合C++文法規則的式子,稱C++算術運算式。運算對象包括常量、變數、函數等。例如,下面是一個合法的C++算術運算式:
    a*b/c-1.5+'a'

C++語言規定了運算子的優先順序和結合性。在求解運算式時,先按運算子的優先順序別高低次序執行,例如先乘除後加減。如有運算式a-b*c,b的左側為減號,右側為乘號,而乘號優先於減號,因此,相當於a-(b*c)。如果在一個運算對象兩側的運算子的優先順序別相同,如a-b+c,則按規定的“結合方向”處理。

C++規定了各種運算子的結合方向(結合性),算術運算子的結合方向為“自左至右”,即先左後右,因此b先與減號結合,執行a-b的運算,再執行加c的運算。“自左至右的結合方向”又稱“左結合性”,即運算對象先與左面的運算子結合。以後可以看到有些運算子的結合方向為“自右至左”,即右結合性(例如賦值運算子)。關於“結合性”的概念在其他一些進階語言中是沒有的,是C和C++的特點之一,希望能弄清楚。

C++所有運算子以及它們的優先順序別和結合性請查看這裡:C++運算子優先順序表
運算式中各類數值型資料間的混合運算在運算式中常遇到不同類型資料之間進行運算,如:
    10+'a'+1.5-8765.1234*'b'
在進行運算時,不同類型的資料要先轉換成同一類型,然後進行運算。轉換的規則按圖2.7所示。


圖2.7
假設已指定i為整型變數,f為float變數,d為double型變數,e為long型,有下面運算式:
    10+'a'+i*f-d/e
運算次序為:
  1. 進行10+'a'的運算,先將'a'轉換成整數97,運算結果為107。
  2. 進行i*f的運算。先將i與f都轉換成double型,運算結果為double型。
  3. 整數107與i*f的積相加。先將整數107轉換成雙精確度數(小數點後加若干個0,即107.000…00),結果為double型。
  4. 將變數e轉換成double型,d/e結果為double型。
  5. 將10+'a'+i*f的結果與d/e的商相減,結果為double型。
上述的類型轉換是由系統自動進行的。C++自增和自減運算子(--和++)在C和C++中,常在運算式中使用自增(++)和自減(--)運算子,他們的作用是使變數的值增1或減1,如:
++i(在使用i之前,先使i的值加1,如果i的原值為3,則執行j=++i後,j的值為4)
--i (在使用i之前,先使i的值減1,如果i的原值為3,則執行j=--i後,j的值為2)
i++ (在使用i之後,使i的值加1,如果i的原值為3,則執行j=i++後,j的值為3,然後i變為4)
i--(在使用i之後,使i的值減1,如果i的原值為3,則執行j=i--後,j的值為3,然後i變為2)
++i是先執行i=i+1後,再使用i的值;而i++是先使用i的值後,再執行i=i+1。

正確地使用++和--,可以使程式簡潔、清晰、高效。請注意:
  1. 自增運算子(++)和自減運算子(--)只能用於變數,而不能用於常量或運算式。
  2. ++和--的結合方向是“自右至左”。
  3. 自增運算子(++)和自減運算子(--)使用十分靈活,但在很多情況下可能出現歧義性,產生“意想不到”的副作用。
  4. 自增(減)運算子在C++程式中是經常見到的,常用於迴圈語句中,使迴圈變數自動加1。也用於指標變數,使指標指向下一個地址。
C++強制類型轉換在運算式中不同類型的資料會自動地轉換類型,以進行運算。有時程式編製者還可以利用強制類型轉換運算子將一個運算式轉換成所需類型。例如:
    (double)a  (將a轉換成double類型)
    (int)(x+y)   (將x+y的值轉換成整型)
    (float)(5%3)  (將5%3的值轉換成float型)

強制類型轉換的一般形式為:
    (類型名)(運算式)

注意:如果要進行強制類型轉換的對象是一個變數,該變數可以不用括弧括起來。如果要進行強制類型轉換的對象是一個包含多項的運算式,則運算式應該用括弧括起來。如果寫成
    (int)x+y
則只將x轉換成整型,然後與y相加。

以上強制類型轉換的形式是原來C語言使用的形式,C++把它保留了下來,以利於相容。C++還增加了以下形式:
    類型名(運算式)

    int(x)

    int(x+y)

類型名不加括弧,而變數或運算式用括弧括起來。這種形式類似於函數調用。但許多人仍習慣於用第一種形式,把類型名包在括弧內,這樣比較清楚。

需要說明的是在強制類型轉換時,得到一個所需類型的中間變數,但原來變數的類型未發生變化。例如:
    (int)x
如果x原指定為float型,值為3.6,進行強制類型運算後得到一個int型的中間變數,它的值等於3,而x原來的類型和值都不變。

【例2.4】強制類型轉換。
#include <iostream>using namespace std;int main( ){  float x;  int i;  x=3.6;  i=(int)x;  cout<<"x="<<x<<",i="<< i<<endl;  return 0;}
運行結果如下:
   x=3.6,i=3
x的型仍為float型,值仍等於3.6。

由上可知,有兩種類型轉換,一種是在運算時不必使用者指定,系統自動進行的類型轉換,如3+6.5。第二種是強制類型轉換。當自動類型轉換不能實現目的時,可以用強制類型轉換。此外,在函數調用時,有時為了使實參與形參類型一致,可以用強制類型轉換運算子得到一個所需類型的參數。
C++賦值運算子與賦值運算式賦值運算子賦值符號“=”就是賦值運算子,它的作用是將一個資料賦給一個變數。如“a=3”的作用是執行一次賦值操作(或稱賦值運算)。把常量3賦給變數a。也可以將一個運算式的值賦給一個變數。
賦值過程中的類型轉換如果賦值運算子兩側的類型不一致,但都是數值型或字元型時,在賦值時會自動進行類型轉換。

1)  將浮點型資料(包括單、雙精確度)賦給整型變數時,捨棄其小數部分。

2)  將整型資料賦給浮點型變數時,數值不變,但以指數形式儲存到變數中。

3) 將一個double型資料賦給float變數時,要注意數值範圍不能溢出。

4)  字元型資料賦給整型變數,將字元的ASCII碼賦給整型變數。

5) 將一個int、short或long型資料賦給一個char型變數,只將其低8位原封不動地送到char型變數(發生截斷)。例如
   short int i=289;
   char c;
   c=i; //將一個int型資料賦給一個char型變數
賦值情況見圖2.8。為方便起見,以一個int型資料佔兩個位元組(16位)的情況來說明。


圖2.8
6) 將signed(有符號)型資料賦給長度相同的unsigned(無符號)型變數,將儲存單元內容原樣照搬(連原有的符號位也作為數值一起傳送)。

【例2.5】將有符號資料傳送給無符號變數。
#include <iostream>using namespace std;int main( ){  unsigned short a;  short int b=-1;  a=b;  cout<<"a="<<a<<endl;  return 0;}
運行結果為
a=65535

賦給b的值是-1,怎麼會得到65535呢?請看圖2.9所示的賦值情況。


圖2.9
-1的補碼形式為1111111111111111(即全部16個二進位位均為1),將它傳送給a,而a是無符號型變數,16個位全1是十進位的65535。如果b為正值,且在0~32767之間,則賦值後數值不變。

不同類型的整型資料間的賦值歸根結底就是一條:按儲存單元中的儲存形式直接傳送。

C和C++使用靈活,在不同類型資料之間賦值時,常常會出現意想不到的結果,而編譯系統並不提示出錯,全靠程式員的經驗來找出問題。這就要求編程人員對出現問題的原因有所瞭解,以便迅速排除故障。
複合的賦值運算子在賦值符“=”之前加上其他運算子,可以構成複合的運算子。如果在“=”前加一個“+”運算子就成了複合運算子“+=”。例如,可以有
    a+=3  等價於  a=a+3
    x*=y+8等價於  x=x*(y+8)
    x%=3  等價於  x=x%3
以“a+=3”為例來說明,它相當於使a進行一次自加3的操作。即先使a加3,再賦給a。同樣,“x*=y+8”的作用是使x乘以(y+8),再賦給x。

為便於記憶,可以這樣理解:
  1. a+= b(其中a為變數,b為運算式)
  2. a+= b (將有底線的“a+”移到“=”右側)
  3. a = a + b  (在“=”左側補上變數名a)

注意,如果b是包含若干項的運算式,則相當於它有括弧。如
  1. x %= y+3
  2. x %= (y+3)
  3. x = x%(y+3)(不要錯認為x=x%y+3)
  
凡是二元(二目)運算子,都可以與賦值符一起組合成複合賦值符。C++可以使用以下幾種複合賦值運算子:
    +=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=
其中後5種是有關位元運算的。

C++之所以採用這種複合運算子,一是為了簡化程式,使程式精鍊,二是為了提高編譯效率(這樣寫法與“逆波蘭”式一致,有利於編譯,能產生品質較高的目標代碼)。專業的程式員在程式中常用複合運算子,初學者可能不習慣,也可以不用或少用。
賦值運算式由賦值運算子將一個變數和一個運算式串連起來的式子稱為“賦值運算式”。它的一般形式為:
    <變數> <賦值運算子> <運算式>
如“a=5”是一個賦值運算式。對賦值運算式求解的過程是:先求賦值運算子右側的“運算式”的值,然後賦給賦值運算子左側的變數。一個運算式應該有一個值。賦值運算子左側的標識符稱為“左值”(left value,簡寫為lvalue)。並不是任何對象都可以作為左值的,變數可以作為左值,而運算式a+b就不能作為左值,常變數也不能作為左值,因為常變數不能被賦值。

出現在賦值運算子右側的運算式稱為“右值”(right value,簡寫為rvalue)。顯然左值也可以出現在賦值運算子右側,因而左值都可以作為右值。如:
    int a=3,b,c;
    b=a;// b是左值
    c=b;// b也是右值
賦值運算式中的“運算式”,又可以是一個賦值運算式。如
    a=(b=5)
下面是賦值運算式的例子:
    a=b=c=5  (賦值運算式值為5,a,b,c值均為5)
    a=5+(c=6)(運算式值為11,a值為11,c值為6)
    a=(b=4)+(c=6)  (運算式值為10,a值為10,b等於4,c等於6)
    a=(b=10)/(c=2) (運算式值為5,a等於5,b等於10,c等於2)
請分析下面的賦值運算式:
    (a=3*5)=4*3
賦值運算式作為左值時應加括弧,如果寫成下面這樣就會出現語法錯誤:
    a=3*5=4*3
因為3*5不是左值,不能出現在賦值運算子的左側。

賦值運算式也可以包含複合的賦值運算子。如
    a+=a-=a*a
也是一個賦值運算式。如果a的初值為12,此賦值運算式的求解步驟如下:
  1. 先進行“a-=a*a”的運算,它相當於a=a-a*a=12-144=-132。
  2. 再進行“a+=-132”的運算,它相當於a=a+(-132)=-132-132=-264。
C++逗號運算子與逗號運算式C++將賦值運算式作為運算式的一種,使賦值操作不僅可以出現在賦值語句中,而且可以以運算式形式出現在其他語句(如輸出語句、迴圈語句等)中。這是C++語言靈活性的一種表現。

請注意,用cout語句輸出一個賦值運算式的值時,要將該賦值運算式用括弧括起來,如果寫成“cout<<a=b;”將會出現編譯錯誤。

C++提供一種特殊的運算子——逗號運算子。用它將兩個運算式串連起來。如
    3+5, 6+8
稱為逗號運算式,又稱為“順序求值運算子”。逗號運算式的一般形式為:
    運算式1, 運算式2
逗號運算式的求解過程是:先求解運算式1,再求解運算式2。整個逗號運算式的值是運算式2的值。如,逗號運算式
   a=3*5, a*4
賦值運算子的優先順序別高於逗號運算子, 因此應先求解a=3*5(也就是把“a=3*5”作為一個運算式)。經計算和賦值後得到a的值為15,然後求解a*4,得60。整個逗號運算式的值為60。

一個逗號運算式又可以與另一個運算式組成一個新的逗號運算式,如
    (a=3*5, a*4), a+5
逗號運算式的一般形式可以擴充為:
    運算式1, 運算式2, 運算式3, …, 運算式n
它的值為運算式n的值。

逗號運算子是所有運算子中層級最低的。因此,下面兩個運算式的作用是不同的:
    x=(a=3, 6*3)
    x=a=3, 6*a

其實,逗號運算式無非是把若干個運算式“串聯”起來。在許多情況下,使用逗號運算式的目的只是想分別得到各個運算式的值,而並非一定需要得到和使用整個逗號運算式的值,逗號運算式最常用於迴圈語句(for語句)中。

在用cout輸出一個逗號運算式的值時,要將該逗號運算式用括弧括起來,如:
    cout<<(3*5, 43-6*5, 67/3)<<endl;

C和C++語言表達能力強,其中一個重要方面就在於它的運算式類型豐富,運算子功能強,因而使用靈活,適應性強。







C語言實驗二 資料類型、運算子與運算式 與順序運算式

1. #include <stdio.h> main() { int x,y,z; float arev; printf("請輸入三個整數,用空格隔開:\n"); scanf("%d%d%d",&x,&y,&z); arev=(float)((x+y+z)/3); printf("平均數為:%f",arev); } 2. #inlcude <stdio.h> main() { int temp, a,b; printf("請輸入兩個整數,用空格隔開:\n"); scanf("%d%d",&a,&b); printf("a=%d,b=%d",a,b); a=temp;b=a;b=tem; printf("交失A,B的值後,a=%d,b=%b",a,b); } 3.沒給賞分,第三題就先不做了.
 
C語言運算子有什?都分別包括什意思?又有什用處?

一、賦值運算子
指派陳述式的作用是把某個常量或變數或運算式的值賦值給另一個變數。符號為‘=’。這裡並不是等於的意思,只是賦值,等於用‘==’表示。
注意:指派陳述式左邊的變數在程式的其他地方必須要聲明。
得已賦值的變數我們稱為左值,因為它們出現在指派陳述式的左邊;產生值的運算式我們稱為右值,因為她它們出現在指派陳述式的右邊。常數只能作為右值。
例如:
count=5;
total1=total2=0;
第一個指派陳述式大家都能理解。
第二個指派陳述式的意思是把0同時賦值給兩個變數。這是因為指派陳述式是從右向左運算的,也就是說從右端開始計算。這樣它先total2=0;然後total1=total2;那麼我們這樣行不行呢?
(total1=total2)=0;
這樣是不可以的,因為先要算括弧裡面的,這時total1=total2是一個運算式,而指派陳述式的左邊是不允許運算式存在的。

二、算術運算子
在C語言中有兩個單目和五個雙目運算子。
符號 功能
+ 單目正
- 單目負
* 乘法
/ 除法
% 模數
+ 加法
- 減法
下面是一些指派陳述式的例子, 在賦值運算子右側的運算式中就使用了上面的算術運算子:
Area=Height*Width;
num=num1+num2/num3-num4;
運算子也有個運算順序問題,先算乘除再算加減。單目正和單目負最先運算。
模數運算子(%)用於計算兩個整數相除所得的餘數。例如:
a=7%4;
最終a的結果是3,因為7%4的餘數是3。
那麼有人要問了,我要想求它們的商怎麼辦呢?
b=7/4;
這樣b就是它們的商了,應該是1。
也許有人就不明白了,7/4應該是1.75,怎麼會是1呢?這裡需要說明的是,當兩個整數相除時,所得到的結果仍然是整數,沒有小數部分。要想也得到小數部分,可以這樣寫7.0/4或者7/4.0,也即把其中一個數變為非整數。
那麼怎樣由一個實數得到它的整數部分呢?這就需要用強制類型轉換了。例如:
a=(int) (7.0/4);
因為7.0/4的值為1.75,如果在前面加上(int)就表示把結果強制轉換成整型,這就得到了1。那麼思考一下a=(float) (7/4);最終a的結果是多少?
單目減運算子相當於取相反值,若是正值就變為負值,若是負數就變為正值。
單目加運算子沒有意義,純粹是和單目減構成一對用的。

三、邏輯運算子
邏輯運算子是根據運算式的值來返回真值或是假值。其實在C語言中沒有所謂的真值和假值,只是認為非0為真值,0為假值。
符號 功能
&& 邏輯與
|| 邏輯或
! 邏輯非
例如:
5!3;
0||-2&&5;
!4;

當運算式進行&&運算時,只要有一個為假,總的運算式就為假,只有當所有都為真時,總的式子才為真。當運算式進行||運算時,只要有一個為真,總的值就為真,只有當所有的都為假時,總的式子才為假。邏輯非(!)運算是把相應的變數資料轉換為相應的真/假值。若原先為假,則邏輯非以後為真,若原先為真,則邏輯非以後為假。
還有一點很重要,當一個邏輯運算式的後一部分的取值不會影響整個運算式的值時,後一部分就不會進行運算了。例如:
a=2,b=1;
a||b-1;
因為a=2,為真值,所以不管b-1是不是真值,總的運算式一定為真值,這時後面的運算式就不會再計算了。

四、關係運算子
關係運算子是對兩個運算式進行比較,返回一個真&#......餘下全文>>
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.