# 基本運算

基本的算術運算,共分成 4 類
算術運算、關係運算、邏輯運算以及運算

# 運算子

運算子總共分成了六大類:
算術運算子、關係運算子、邏輯運算子、運算子、複合運算子以及特殊運算子

又根據操作的數據數量不同,分成了三類運算子:
一元運算子、二元運算子、三元運算子

# 算術運算

# 算術運算子

  • 算術運算子包括加 + 、減 - 、乘 * 、除 / 以及求餘數 %
  • 算術運算子皆為二元運算子
  • 運算子作用的對象稱為操作數% 運算的兩個操作數必須是整數
  1. 乘法運算子是不能省略的,數學中寫的b24acb^2-4ac 需寫成 b*b - 4*a*c
  2. 除法運算時,注意加上括號!!例如:x2a\frac{x}{2a} 應寫為 x/2.0/ax/(2.0*a) ,絕不是 x/a*2.0

# 數學函式 #include

C++ 中沒有次方運算子,也没有指數、對數、三角函數的運算子,
他們是透過調用函數實現。如:
pow(x,n) xnx^n
sqrt(x) x\sqrt{x}
exp(x) exe^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]

#include<iostream>
#include<cmath> // 數學函數包含在頭文件 <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;
}

對數運算的xnx^n,n 如果在 4 以下的話,建議直接用 x*xx*x*x*x 等方式即可
避免使用 pow(x,n)

# 遞增遞減運算子

前置 ++ : ++i ,後置 ++ : i++
前置 -- : --i ,後置 -- : i--

  • 為一元運算子
  • 無論是前置或是後置, ++ 皆會使變數自身 + 1, -- 皆會使變數自身 - 1
int n = 5,m = 10;
n++;  // 相當於 n = n + 1;
m--;  // 相當於 m = m - 1; 
cout<<n<<endl; // 結果為 6
cout<<m<<endl; // 結果為 9
  • 作為表達式的話,
    前置運算子會先將變數 + 1/-1 後,再去做運算
    後置運算子會先運算變數,之後再 + 1/-1
int n = 5,m = 10;
int a,b,c,d
a = n++; // a =  5 ,n = 6 
b = m--; // b = 10 ,m = 9
n = 5,m = 10;
a = ++n; // a = 6 , n = 6
b = --m; // b = 9 , m = 9

# 優先級

  • 先乘除求餘,後加減,級別相同則由左至右算
    1+2*3 2+3+4 6*2/3

  • 小括號能改變優先級
    (1+2)*3

  • 小括號可以嵌套,越裡面的小括號,優先級越高。
    ((1+2)*3+(2+3)*2)*7

  • 後置 ++ -- 的優先級 > 前置 ++ -- 的優先級

  • 前置 ++ -- 的優先級 > 乘除的優先級

建議時常用小括號,標明計算的優先順序,免得出問題

# 運算的資料型態

  • 相同的資料型態在做運算時,仍會保留原資料型態。
    1+2 1-2 1*2 1/2
    1.0+2.0 1.0-2.0 1.0*2.0 1.0/2.0

  • 不同的資料型態運算,默認會向級別高的型態轉換。
    (低) short /char ➡️ int ➡️ unsigned ➡️ long ➡️ double (高)
    1/2.0 1.0/

整數和整數運算結果仍為整數:
所以 1/2 結果為 0, 1.0/2 的結果為 0.5

  • 強制型態轉換
(<類型>)x 或 <類型>(x)
int a=7,b=3;
double c;
// 若想取得 a /b 的真實結果:
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 則結果為真

# 關係表達式

將兩個關係表達式以關係運算子連結,構成關係表達式
回傳的結果為邏輯值: truefalse

double a = 1.0,b = -4.0,c = 3.0;
b*b-4.0*a*c ==0 //false
b*b-4.0*a*c > 0 //true

# 注意

  • 在判斷兩個表達式的值是否相等的時候,一定要用兩個等號,不能只用一個
  • 關係運算子不要連著用
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;

# 邏輯運算

表達、判斷多個條件之間的關係,同時成立、之一成立或不成立。

# 邏輯運算子

符號功能範例說明
&&邏輯 ANDa>2&&a<9若 2<a<9 則結果為真
||邏輯 ORa<2 || a>9若 a<2 或 a>9 則為真
!邏輯 NOT!(a==1)若 a≠1 則結果為真
  • ! 為 一元運算子
  • &&|| 為二元運算子

# 表達式的值

邏輯值: truefalse

  • 運算 <條件式1> && <條件式2 ,兩個都為 true ➡️ true
條件式 1條件式 2結果
falsefalsefalse
falsetruefalse
truefalsefalse
truetruetrue
  • 運算 <條件式1> || <條件式2 ,任一個為 true ➡️ true
條件式 1條件式 2結果
falsefalsefalse
falsetruetrue
truefalsetrue
truetruetrue
  • 運算 !<條件>
條件結果
truefalse
falsetrue

# 位運算

  • 數據在計算機中是以二進制的方式存放
  • 位元運算:對整數的二進制進行操作
    假設: a = 0110 1001Bb = 0101 110B
a01101001B
b01011100B

# 位運算子

二元運算子功能邏輯
&按位 “與”and
|按位 “或”or
^按位 “異或”xor
~按位 “變反”not
<<左移
>>右移

# 運算結果

  • 按位 “與” <整數A> & <整數B>
    皆為 1 才為 1
A0011
B0101
結果0001
  • 按位 “或” <整數A> | <整數B>
    任一者為 1 就為 1
A0011
B0101
結果0111
  • 按位 “異或” <整數A> ^ <整數B>
    兩者不同才為 1
A0011
B0101
結果0110
  • 按位 “變反” ~<整數A>
    0➡️1,1➡️0
A0011
結果1100
  • 位移運算
    使數值左移或右移指定的位數,如:左移兩位
八位數76543210
初始值01101001
左移兩位01101001空位 補 0
结果值溢出抹去10100100

# 應用

  • 運用按位 “與” 可以將某些位設置為 0
    例如:我想將數字 a 的後半部變成 0,只要其跟 0 做運算即可
a= 01101001B
&b= 11110000B
c= 01100000B
  • 運用按位 “或” 可以將某些位設置為 1
    例如:我想將數字 b 的前半部都轉成 1,只要跟其跟 1 做運算即可
a= 01101001B
|b= 11110000B
c= 11111001B
  • 運用按位 “異或” 可以將某些位相反,部分位保持不變
    • 和 1 “異或” 變反
      • 1^1 = 0
      • 0^1 = 1
    • 和 0 “異或” 不變
      • 0^0 = 0
      • 1^0 = 1

例如:我想要將數字 a 的前半部變反,後半部保持不變

a= 01101001B
^b= 11110000B
c= 10011001B

# 複合位運算

二元運算子功能範例說明
&=複合與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; // 結果為 42
cout << (4 << 2) <<endl;// 結果為 16

# 特殊運算子

# 指定運算子 =

# 作用

  1. 將右邊的值存入左邊
int a = 3,b = 9,c;
c = a+b;// 指定語句
  1. 作為表達式,他的值就是右邊 <表達式> 的值
int a = 3,b = 9,c;
cout<<(c = a + b)<<endl; // 顯示 8
cout<<c<<endl;  // 顯示 8

# 優先級

  • 優先級較低,低於邏輯運算子,
  • 和複合運算子同級
  • 結合順序由右至左
int a = 1,b = 5,x ,y,z;
x = y = z = a + b;
//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); //4
sizeof(<資料型態>)
sizeof(int); //4
sizeof(<表達式>)
sizeof(3+1); //4
sizeof(3>1); //1

# 條件運算子 (三元運算子) ? :

  • 當 <條件式> 為真,則運行 < 表達式 1>
  • 當 <條件式> 為假,則運行 < 表達式 2>
<條件式> ? <表達式1> : <表達式2>
int y;
y =  3 > 2 ?  2 : 1; 
cout << y << endl; // 顯示 2

<表達式 1> 和 < 表達式 2 > 的值應具有相同類型,或能轉換為相同的型態

y = (t >= 0 ? 1 : 0); // 正確
y = (x > 1 ? 1 : "error"); // 錯誤

# 逗號運算子 ,

逗號 , 是一個運算子
多個表達式用逗號隔開,構成逗號表達式

<表達式1>,<表達式2>,...,<表達式n>

從左向右一次計算 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 位元,能表示的數較大
intshort ,要丟掉 2 位元的信息,不可行
shortint ,增加儲存空間,但不丟失信息,可行

# 算術轉換方式

  • 位元少的向位元多的轉換
    char , unsigned char , short , unsigned short , bool ➡️ int
cout<<('a' + 5)<<endl; //'a' 轉換為 int ,再加 5,結果為整數
  • 精度低向精度高的轉換
    int ➡️ float ➡️ double
double a = 3.5;
cout<<(a + 5)<<endl; //5 轉換為 double,再加上 a,結果為 double
  • 有符號向無符號轉換
    int ➡️ unsigned int
unsigned int ui = 32678;
cout<<(ui + 5)<<endl; // 5 轉換為 unsigned int 再相加,結果為無號 int

# 隱式轉換時機

  1. 混和類型的表達式

charint 相加,是字元的 ASCII 和整數相加

int n = 2;
char c = 'a';
cout<<(c + n)<<endl; //'a' 的 ASCII 為 97,加上 2,得到結果為整數 99
  1. 指定

向左值做型態轉換

double a = 8.12;
int k;
k = a; //a 轉換為 int,捨去小數後, k = 8

double 指定給 int 會捨去小數
向低精度轉換 會 損失有效數字

整數 / 整數 = 整數,3 / 2 = 1,而不是 1.5
整數相除,結果仍為整數,小數會捨去,切記

  1. 在需要關係、邏輯表達式的地方
    非 0 轉換為 true;0 轉換為 false

# 顯示轉換

程式中明確標記轉換的類型,就是顯式轉換,也就是強制型態轉換

<型態>(<表達式>)
(<型態>)<表達式>
  • 優先級:高於乘除,和邏輯 not 同級
  • 結合順序:從右至左
double a = 128,b = 30;
int n = 3;
a = (double)n/2; // 強制將 n 轉換為 double
n = int(a/b);    // 強制將 a/b 的結果轉換為 int
更新於 閱讀次數

用實際行動犒賞爆肝的我😀

Zrn Ye LinePay

LinePay