---
# System prepended metadata

title: MVMC 基礎程式練習

---

# MVMC 基礎程式練習

1. 請解釋 `i++` 與 `++i` 的不同。 (實驗一相關)
    ```c=
    #include <stdio.h>

    int main() {
        int A = 0;
        int B = 0;

        int C = A++;

        // int C = A;
        // A = A + 1;

        int D = ++B;
        // B = B + 1;
        // D = B;

        printf("%d %d %d %d\n", A, B, C, D);

        return 0;
    }
    ```
2. [reverse-integer](https://leetcode.com/problems/reverse-integer/) (實驗二相關)
3. 試宣告以下
    - 一個整型數型態（An integer）
    ``` =c
    int q;
    ```
    - 一個指向整數型態的指標（A pointer to an integer）
    ```=c
    int *q;
    ```
    - 一個指向指標的指標，它指向的指標是指向一個整型數（A pointer to a pointer to an integer）
    ```=c
    int **q;
    ```
    - 一個有10個整數的陣列（An array of 10 integers）
    ```=c
    int q[10];
    ```
    - 一個有10個指標的陣列，該指標指向一個整數（An array of 10 pointers to integers）
    ```=c
    int *q[10];
    ```
    - 一個指向有10個整數型態陣列的指標（A pointer to an array of 10 integers）
    ```=c
    int (*q)[10];
    ```
    - 一個指向函數的指標，該函數有一個整數型態參數並返回一個整數（A pointer to a function that takes an integer as an argument and returns an integer）
    ```=c
    int (*q)(int );
    int squre (int a){
        return a * a;
    }
    q = &squre;
    
    squre(10);
    q(10);
    ```
    - 一個有10個指標的陣列，該指標指向一個函數，該函數有一個整數型態參數並返回一個整型（An array of ten pointers to functions that take an integer argument and return an integer）
    ```=c
    int (*q[10])(int);
    ```
    :::info
    [第11題](https://hackmd.io/@Rance/SkSJL_5gX?type=view)
    :::
    
4. [reverse-string](https://leetcode.com/problems/reverse-string/)
5. bitwise swap
可用運算符號有: __&__ (and), __|__ (or), __^__ (xor), __>>__ (right shift), __<<__ (left shift), __~__ (arithmetic not), __!__ (logical not)
```=c
void swap (int *x, int *y){
    *x ^= *y;
    *y ^= *x;
    *x ^= *y;
    x ^= y
    x = x ^ y
    
    //x += y 
    //x = x + y 

    // x ^= y
    // x = x ^ y
    
    // y ^= x 
    // y = y ^ x = y ^ (x ^ y) = x
    
    // x ^= y
    // x = (x ^ y) ^ x = y
    
}
```

6. macro trap
判斷以下程式碼是否能正常執行
若不能 解釋原因
```c=
#define max(x,y) x > y ? x : y
max(a, max(b, c));
max(a, a+1)
//max(a, b > c ? b : c)
// ->
// a > b > c ? b : c ? a : b > c ? b : c
// 
// imporve
// #define max(x,y) (x) > (y) ? (x) : (y)
// (a) > ((b) > (c) ? (b) : (c) ) ? (a) : ((b) > (c) ? (b) : (c) )
```
7. 比較下列寫法與第6題之差異
```c=
int max(int x, int y){
    if (x > y){
        return x;
    }else{
        return y;
    }
}

max(a, max(b, c));
```

-------------------------------------------
## 工具
- [Linux上安裝cdecl](https://hackmd.io/@sysprog/c-pointer#英文很重要)
- [cdecl online](https://cdecl.org/?q=char+%28*%28*%28*+const+x%5B3%5D%29%28%29%29%5B5%5D%29%28int%29)