int x = 10; //global int main() { int y = 5; { int x = 20; int z = 8; printf("%d", x); // x=20, 用完即清除 } printf("%d", x); // x=10 printf("%d", z); // compile error return 0; }
Ex2:
1 2 3 4 5 6 7 8 9 10 11 12 13
int x = 20; int main() { int y = 10; fun(y); return 0; } ------------------- void fun(int a) { int y = 30; printf("%d, %d", x, y); }
Ans: (20, 30)
Note: 在 C 語言裡, 只要不是指標, 就是 call by-value
local variable => 與 function 一樣, 用 stack 放 => 後進先出
#include <stdio.h> int main() { int N, sum = 0, i; scanf("input: %d", &N); for(i = 1; i ≤ N; i++) { sum = sum + i; } printf("total:%d", sum); return 0; }
運算子
Operator
Priority
Associative
(), []
高
右結合
!, ~, -(負), ++, –
左結合
*, /, +, - (算數1)
左結合
<<, >>
左結合
<, >, ≤, ≥ (關係2)
左結合
位元 (3)
左結合
logical (4)
左結合
= (assign)
低
右結合
Note:
1>2>3>4
多個 operator 之運算, 先看 priority, 若相同在看 associate
Associative 分為:
左結合 ((3+5)+8)
右結合 (3+(5+8))
operator 分為:
unary operator (單元)
ex: -5, !flag
binary operator (二元)
ex: 3+5, 6-4, 7*8
trinary operator (三元) 條件式 ? x : y
1 2 3 4 5 6 7
if (條件式) { x } else { y }
=: assign , ==: equals
++, –
前置式
後置式
先做++, --, 再取值
先取值, 再做++, –
++x, --x
x++, x–
Ex1:
1 2 3 4 5 6 7
int x = 5, y=5; int A, B; A = x++; B = ++y; print(A, B, x, y);
// 5, 6, 6, 6
Ex2: a = 3, b = 6, 則 39/-++a+-20%b--
Sol: 39/(-4)+(-29)%6 = -9 + (-5) = -14
位元運算
概念:先將資料化成 2 進制, 再開始進行運算
AND (&)
OR (|)
XOR (^)
<<
“>>”
EX1: int x = 8 & 6;, (0 0 0 0)2 = 0, 同時為 1 才成立, 像 (.)
EX2: int x = 8 | 6;, (1 1 1 0)2 = 14, 像 (+)
EX3: int x = 8 ^ 6;, (1 1 1 0 )2 = 14, 相同為 0, 相異為 1
EX4: << 左移, x << n => 將 x 左移 n 個 bits,
作法:在右邊加上 n 個 0 (具備 乘法 效果)
例如:int x = 8 << 2;, (100000)2 = 32
switch(x) { default: printf("No match"); case 1: printf("1"); case 2: printf("2"); } // 1. x = 2 => 印出 2 // 2. x = 5 => 印出 No match 1 2
重複 => loop in C 常用 loop 語法
for
格式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
for ( exp1(1); exp2(2); exp3(4)) { statement(3); } // 1. initial: 只做一次,於進入時做 // 2. conditional: 成立,做 3, 接著 4, 再回到 2。不成立,跳出 for loop ---------------------------------- // special case: for ( ; (true); ;) [ // 無窮迴圈 ] => while (true) { ... }
Ex: 1+2+3…+10, 用 for 寫
1 2 3 4 5 6 7
int sum = 0, i; for(i = 1; i ≤ 10; i++) { sum = sum + i; } printf("sum=%d", sum);
// 55, i = 11 最終跑到 11 不成立
while
格式:
1 2 3 4 5 6 7 8 9
// 承上題 int sum = 0, i; i = 1; while (i ≤ 10) { sum = sum + i; i++; } printf("sum=%d", sum);
do…while
格式:
1 2 3 4 5
do(1) { (3) (4) }while(2);
Compare 前測式 VS 後測式
前測式
後測式
先做測試,成立才做 statement => 最少做 0 次
先做,再做測試 => 最少做 1 次
while, for loop
do-while
Note: C語言和 C++ 中, 所有關鍵字都是小寫
Compare counted loop VS conditional loop
counted loop (計數式)
conditional loop(條件式)
執行次數明確
執行次數不明確,在一特定的條件,成立或不成立才終止
ex: 1+2+…+100
linked list 長度
for loop
while loop
continue & break
continue
break
遇到時,則之後的敘述不做,直接進入 loop 的下一回合
遇到時,直接跳出所屬的 loop
ex:
1 2 3 4 5 6 7 8 9 10 11
int sum = 0; for (int i = 2; i ≤ 10; i+=2) { if (i == 6) continue; sum += i; } printf("%d", sum);
// i 2 4 6 8 10 12 //sum 2 6 X 14 24 stop //sum = 24
ex2: 承上題 若 continue 改為 break
1 2 3 4 5 6 7 8 9 10 11
int sum = 0; for (int i = 2; i ≤ 10; i+=2) { if (i == 6) break; sum += i; } printf("%d", sum);
// i 2 4 6 //sum 2 6 X //sum = 6
ex3: 呈例 2, 將 == 改為 =
1 2 3 4 5 6 7 8 9
int sum = 0; for (int i = 2; i ≤ 10; i+=2) { if (i = 6) break; sum += i; } printf("%d", sum);
//sum = 0
Pointer (指標)
說明:
一般變數
指標變數
int x;
int *p;
Ex:
1 2 3 4 5 6
int x = 5; // 下面兩行為 int *p = &x int *p; p = &x; *p = *p + 1; // 利用指標間接操作指向的內容 printf("%d", x)
Ex: 一學生採 C language coding 如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
int main() { int a = 10, b = 20; swap(a, b); printf("%d, %d", a, b); return 0; } void swap(int x, int y) { int temp; temp = x; x = y; y = temp; }
Q:
1. 為何呼叫 swap 後, a, b 沒變動?
由於此時 swap 的參數傳遞是採用 call by value, 而非 call by address, 故沒有 side effect, 因此 x, y 的變動, a, b 不受影響
2. How to modify the program?
in C => 用 pointer 以改成 call by address
in C++ => 用 pointer or 用 call by reference
1 2 3 4 5 6 7 8 9 10 11 12 13 14
int main() { int a = 10, b = 20; swap(&a, &b); printf("%d, %d", a, b); return 0; } void swap(int *x, int *y) { int temp; temp = *x; *x = *y; *y = temp; }
陣列(Array)
宣告方式:
type 變數 [size];
int A [5];
Note: 在 C, C++ 中, 陣列名稱本身為 一固定(其內容不可更動)指標, 永遠指向第 [0]格