Make
each
day
count
運算式 (expressions) 是由⼀序列運算子 (operators) 和運算元
(operands) 組成,可以在程式中執行所需的運算工作 (即處理資料)
運算子代表要進行的運算作業,如加法運算
運算元為運算對象,如加數與被加數
運算式的組成
3
150
運算元
100
運算元
250
運算結果
運算子
運算
運算式
Make
each
day
count
C 語言的運算子依運算元個數可以分成三種
單元運算子 (unary operator):只需⼀個運算元,例如:負號、遞增、遞增
-15
10++
二元運算子 (binary operator):需要有位在左右的兩個運算元,C 語言的
運算子大部分都是二元運算子
5 + 10
10 * 2
三元運算子 (ternary operator):需要3個運算元,C 語言只有⼀種三元運算
子「? :」用來建立條件運算式,詳見單元5說明
max = (a > b)? a : b;
C語言的運算子
4
Make
each
day
count
指定運算式 (assignment expressions) 就是指定敘述,將右邊運算元
或運算式運算結果,存入位在左邊的變數
int x = 10, y = 20, temp;
printf("x=%d, y=%dn", x, y);
temp = x;
x = y;
y = temp;
printf("x=%d, y=%dn", x, y);
指定運算子
5
Make
each
day
count
printf("標準體重是%0.1f公斤,你的體重是%0.1f公斤,為", std_weight, weight);
if (weight >= std_weight * 0.9 && weight <= std_weight * 1.1)
printf("正常體重n");
if (weight > std_weight * 1.1 && weight <= std_weight * 1.2)
printf("體重過重n");
if (weight < std_weight * 0.9 && weight >= std_weight * 0.8)
printf("體重過輕n");
if (weight > std_weight * 1.2)
printf("肥胖n");
if (weight < std_weight * 0.8)
printf("體重不足n");
}
Lab3 體重評估 4/4
27
Make
each
day
count
位元運算子 (bitwise operators) 是對資料進行逐位元 (bitwise) 運算
位元左移運算,最高有效位元(most significant bit,MSB) 被移出(消失),
最低有效位元(least significant bit,LSB) 補 0
位元右移運算,最高有效位補符號位元,最低有效位元被移出(消失)
位元運算子 1/2
28
運算子 說明 運算式範例
& 位元AND X & 10
<< 位元左移 x << 1
>> 位元右移 x >> 1
^ 位元XOR x ^ 0xF
| 位元OR x | 0xF
~ 位元NOT ~x
Make
each
day
count
short num = 0b01110101;
printf("%#x & 0xff = %#xn", num, num & 255);
printf("%#x << 1 = %#xn", num, num << 1);
printf("%#x >> 1 = %#xn", num, num >> 1);
printf("%#x ^ 0xff = %#xn", num, num ^ 255);
printf("%#x | 0xff = %#xn", num, num | 255);
printf("~%#x = %#xn", num, ~num);
位元運算子 2/2
29
Make
each
day
count
複合運算子 (Compound Operators) 同時執行『算術運算子或位元運
算子』及『指定運算子』兩件工作
複合指定運算子
30
運算子 範例 對等運算式 說明
+= 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 = x & y; 位元AND
|= x |= y; x = x | y; 位元OR
^= x ^= y; x = x ^ y; 位元XOR
>>= x >>= y; x = x >> y; 右移
<<= x <<= y; x = x << y; 左移
Make
each
day
count
int nums[10];
printf("sizeof char type = %dn", sizeof(char));
printf("sizeof short int type = %dn", sizeof(short int));
printf("sizeof int type = %dn", sizeof(int));
printf("sizeof float type = %dn", sizeof(float));
printf("sizeof double type = %dn", sizeof(double));
printf("sizeof long double type = %dn", sizeof(long double));
printf("sizeof integer array variable nums[10] = %dn", sizeof nums);
sizeof運算子 2/2
32
Make
each
day
count
截斷 (多指定給少)
將較多位元的型別資料指定給較少位元的型別變數,會捨棄較多位元的部
份內容
int sum;
int x = 2;
float y = 0.6;
sum = x + y; //無條件捨棄,sum=2
sum = x + y + 0.5; //四捨五入,sum=3
不同型別的變數進行指定以外的運算時,結果的型別會以較多位元者
為主
1/2結果為0 int/int → int
1/2.0結果為0.5 int/float → float
1.0/2結果為0.5 float/int → float
1.0/2.0結果為0.5 float/float → float
資料型別的轉換 2/3
35
Make
each
day
count
a – b + c
- 和 + 同為優先權,結合順序為 '左至右',所以是 (a - b) + c 而不是 a - (b + c)
a=b=10
兩個 = 優先權相同,結合順序為 '右至左',所以是 a= (b=10),而 b=10 的回
傳值是 10,所以 a,b 都會被設成 10
a += b -= 1
+= 和 -= 同為優先權,結合順序為 '右至左',所以是 a += (b-=1),相當於
b = b - 1;
a = a + b;
a ? b : c ? d : e
兩個 ?: 優先權相同,結合順序為 '右至左',所以是 a?b:(c?d:e)
優先序和結合性 6/7
42
Make
each
day
count
a += b << c – d << e
+= 優先權15,<< 優先權6,- 優先權5,所以是 c - d先執行,之後兩
個 << 結合順序為 '左至右',所以是 (b << (c - d)) << e,最後才是 +=
優先序和結合性 7/7
43