# 基本運算基本的算術運算,共分成 4 類算術 運算、關係 運算、邏輯 運算以及位 運算
# 運算子運算子總共分成了六大類:算術 運算子、關係 運算子、邏輯 運算子、位 運算子、複合 運算子以及特殊 運算子
又根據操作的數據數量不同,分成了三類運算子:一元 運算子、二元 運算子、三元 運算子
# 算術運算# 算術運算子算術運算子包括加 +
、減 -
、乘 *
、除 /
以及求餘數 %
算術運算子皆為二元 運算子 運算子作用的對象稱為操作數 , %
運算的兩個操作數 必須是整數 乘法 運算子是不能省略 的,數學中寫的b 2 − 4 a c b^2-4ac b 2 − 4 a c 需寫成 b*b - 4*a*c
除法運算時,注意加上括號!!例如:x 2 a \frac{x}{2a} 2 a x 應寫為 x/2.0/a
或 x/(2.0*a)
,絕不是 x/a*2.0
# 數學函式 #includeC++ 中沒有次方運算子,也没有指數、對數、三角函數的運算子, 他們是透過調用函數實現。如:pow(x,n)
x n x^n x n sqrt(x)
x \sqrt{x} x exp(x)
e x e^x e x log(x)
x 的自然對數中的對數log10(x)
x 的常用對數sin(x)
x 的正弦(弧度)cos(x)
x 的餘弦(弧度)tan(x)
x 的正切(弧度)1/tan(x)
餘切asin(x)
反正弦函數 x ∈ [ − 1 , 1 ] x∈[-1,1] x ∈ [ − 1 , 1 ]
# include <iostream> # include <cmath> using namespace std; int main ( ) { double x; cin>> x; cout<< "sin(x)=" << sin ( x) << endl; cout<< "cos(x)=" << cos ( x) << endl; cout<< "tan(x)=" << tan ( x) << endl; }
對數運算的x n x^n x n ,n 如果在 4 以下的話,建議直接用 x*x
、 x*x*x*x
等方式即可 避免使用 pow(x,n)
# 遞增遞減運算子前置 ++
: ++i
,後置 ++
: i++
前置 --
: --i
,後置 --
: i--
為一元運算子 無論是前置或是後置, ++
皆會使變數自身 + 1, --
皆會使變數自身 - 1 int n = 5 , m = 10 ; n++ ; m-- ; cout<< n<< endl; cout<< m<< endl;
作為表達式的話,前置 運算子會先將變數 + 1/-1 後,再去做運算後置 運算子會先運算變數 ,之後再 + 1/-1 int n = 5 , m = 10 ; int a, b, c, da = n++ ; b = m-- ; n = 5 , m = 10 ; a = ++ n; b = -- m;
# 優先級先乘除求餘,後加減,級別相同則由左至右算1+2*3
2+3+4
6*2/3
小括號能改變優先級(1+2)*3
小括號可以嵌套,越裡面的小括號,優先級越高。((1+2)*3+(2+3)*2)*7
後置 ++
--
的優先級 > 前置 ++
--
的優先級
前置 ++
--
的優先級 > 乘除的優先級
# 運算的資料型態整數和整數運算結果仍為整數: 所以 1/2
結果為 0, 1.0/2
的結果為 0.5
( < 類型> ) x 或 < 類型> ( x) int a= 7 , b= 3 ; double c; c= ( double ) a/ b;
# 複合指定運算子二元運算子 功能 範例 說明 = 簡單指定 x = y 令 x = y += 加法指定 x += y 令 x = x + y -= 減法指定 x -= y 令 x = x - y *= 乘法指定 x *= y 令 x = x * y /= 除法指定 x /= y 令 x = x /y %= 餘數指定 x %= y 令 x = x % y
指定值 x=y 之後,變數 x 原來的值被覆蓋 ,而 y 值不變 善用 可以使程式碼變得更精簡 ,不善使用則... 會很困擾
# 關係運算比較運算:對數大小關係 的判斷
# 關係運算子二元運算子 功能 範例 說明 > 大於 a>b 若 a>b 則結果為真 >= 大於等於 a>=b 若 a≧b 則結果為真 < 小於 a<b 若 a<b 則結果為真 <= 小於等於 a<=b 若 a≦b 則結果為真 == 等於 a==b 若 a=b 則結果為真 != 不等於 a!=b 若 a≠b 則結果為真
# 關係表達式將兩個關係表達式以關係運算子連結,構成關係表達式 回傳的結果為邏輯值: true
、 false
double a = 1.0 , b = - 4.0 , c = 3.0 ; b* b- 4.0 * a* c == 0 b* b- 4.0 * a* c > 0
# 注意在判斷兩個表達式的值是否相等的時候,一定要用兩個等號 ,不能只用一個 關係運算子不要連著用 int a = 3 , b = 5 , c = 7 ; if ( a < b && b < c) cout<< "a < b < c" << endl; if ( a < b < c) cout<< "a < b < c" << endl;
# 邏輯運算表達、判斷多個條件之間的關係,同時成立、之一成立或不成立。
# 邏輯運算子符號 功能 範例 說明 && 邏輯 AND a>2&&a<9 若 2<a<9 則結果為真 || 邏輯 OR a<2 || a>9 若 a<2 或 a>9 則為真 ! 邏輯 NOT !(a==1) 若 a≠1 則結果為真
# 表達式的值邏輯值: true
、 false
運算 <條件式1> && <條件式2
,兩個都為 true ➡️ true 條件式 1 條件式 2 結果 false false false false true false true false false true true true
運算 <條件式1> || <條件式2
,任一個為 true ➡️ true 條件式 1 條件式 2 結果 false false false false true true true false true true true true
# 位運算數據在計算機中是以二進制的方式存放 位元運算:對整數的二進制進行操作 假設: a = 0110 1001B
、 b = 0101 110B
# 位運算子二元運算子 功能 邏輯 & 按位 “與” and | 按位 “或” or ^ 按位 “異或” xor ~ 按位 “變反” not << 左移 >> 右移
# 運算結果按位 “與” <整數A> & <整數B>
皆為 1 才為 1 按位 “或” <整數A> | <整數B>
任一者為 1 就為 1 按位 “異或” <整數A> ^ <整數B>
兩者不同才為 1 八位數 7 6 5 4 3 2 1 0 初始值 0 1 1 0 1 0 0 1 左移兩位 0 1 1 0 1 0 0 1 空位 補 0 结果值 溢出抹去 1 0 1 0 0 1 0 0
# 應用運用按位 “與” 可以將某些位設置為 0 例如:我想將數字 a 的後半部變成 0,只要其跟 0 做運算即可 a= 0110 1001B &
b= 1111 0000B c= 0110 0000B
運用按位 “或” 可以將某些位設置為 1 例如:我想將數字 b 的前半部都轉成 1,只要跟其跟 1 做運算即可 a= 0110 1001B |
b= 1111 0000B c= 1111 1001B
運用按位 “異或” 可以將某些位相反,部分位保持不變 例如:我想要將數字 a 的前半部變反,後半部保持不變
a= 0110 1001B ^
b= 1111 0000B c= 1001 1001B
# 複合位運算二元運算子 功能 範例 說明 &= 複合與 x &= y 令 x = x & y |= 複合或 x |= y 令 x = x | y ^= 複合異或 x ^= y 令 x = x ^ y <<= 複合左移 x <<=k 令 x = x << k >>= 複合右移 x >>=k 令 x = x >>k
# 注意事項一個 &
、 |
和兩個 &&
、 ||
是不同的 再輸出中使用位移運算時,要加括號 cout << 4 << 2 << endl; cout << ( 4 << 2 ) << endl;
# 特殊運算子# 指定運算子 =
# 作用將右邊的值存入左邊 int a = 3 , b = 9 , c; c = a+ b;
作為表達式,他的值就是右邊 <表達式> 的值 int a = 3 , b = 9 , c; cout<< ( c = a + b) << endl; cout<< c<< endl;
# 優先級優先級較低,低於邏輯運算子, 和複合運算子同級 結合順序由右至左 int a = 1 , b = 5 , x , y, z; x = y = z = a + b;
# 左值和右值左值 lvalue能夠出現在等號左邊的式子 能夠被賦值的數 變數、陣列元素、對象等等 右值 rvalue z = x + y = a + b; z = x + ( y = a + b) ; cout<< ( c = a + b) << endl; x = y = z = a + b; z = x + ( y = a + b) ;
# 字節數運算子 sizeof
求某類型的數據或表達式的值佔的位元數
int a; sizeof ( < 常數, 變數, 陣列, 對象> ) sizeof ( a) ; sizeof ( < 資料型態> ) sizeof ( int ) ; sizeof ( < 表達式> ) sizeof ( 3 + 1 ) ; sizeof ( 3 > 1 ) ;
# 條件運算子 (三元運算子) ? :
當 <條件式> 為真,則運行 < 表達式 1> 當 <條件式> 為假,則運行 < 表達式 2> int y; y = 3 > 2 ? 2 : 1 ; cout << y << endl;
<表達式 1> 和 < 表達式 2 > 的值應具有相同類型,或能轉換為相同的型態
y = ( t >= 0 ? 1 : 0 ) ; y = ( x > 1 ? 1 : "error" ) ;
# 逗號運算子 ,
逗號 ,
是一個運算子 多個表達式用逗號隔開,構成逗號表達式
從左向右一次計算 n 個表達式的值 整個表達式的值為 <表達式 n> 的值
int a = 1 , b = 2 , c = 3 ; int y; y = ( a = a + 1 , b = b + 2 , c = c + 3 ) ; a = a+ 1 ; b = b+ 2 ; c = c+ 3 ; y = c;
# 混和運算的類型轉換# 算術轉換原則確保計算值的精度,轉換後盡可能不丟失有效數字。
short
,2 位元,能表示的數小int
,4 位元,能表示的數較大int
轉 short
,要丟掉 2 位元的信息,不可行 short
轉 int
,增加儲存空間,但不丟失信息,可行
# 算術轉換方式位元少的向位元多的轉換char
, unsigned char
, short
, unsigned short
, bool
➡️ int
精度低向精度高的轉換int
➡️ float
➡️ double
double a = 3.5 ; cout<< ( a + 5 ) << endl;
有符號向無符號轉換int
➡️ unsigned int
unsigned int ui = 32678 ; cout<< ( ui + 5 ) << endl;
# 隱式轉換時機混和類型的表達式 char
和 int
相加,是字元的 ASCII 和整數相加
int n = 2 ; char c = 'a' ; cout<< ( c + n) << endl;
指定 向左值做型態轉換
double a = 8.12 ; int k; k = a;
double 指定給 int 會捨去小數 向低精度轉換 會 損失有效數字
整數 / 整數 = 整數,3 / 2 = 1,而不是 1.5 整數相除,結果仍為整數,小數會捨去,切記
在需要關係、邏輯表達式的地方 非 0 轉換為 true;0 轉換為 false # 顯示轉換程式中明確標記轉換的類型,就是顯式轉換,也就是強制型態轉換
優先級:高於乘除,和邏輯 not 同級 結合順序:從右至左 double a = 128 , b = 30 ; int n = 3 ; a = ( double ) n/ 2 ; n = int ( a/ b) ;