# 課堂測驗 (Week # 1)
## Q1: 以下程式的作用為何?
```C
int p(int i, int N)
{
return (i < N && printf("%d\n", i) && !p(i + 1, N)) \
|| printf("%d\n", i);
}
```
* `&&` 前後的敘述對調,是否影響輸出?
* 從 `i < N && printf("%d\n", i)` 變更為 `printf("%d\n", i) && (i < N)` 的話,程式輸出為何?
## Q2: 考慮以下 swap 程式:
```C
void swap(int *a, int *b)
{
int t; t = *a; *a = *b; *b = t;
}
```
能否避免使用區域變數 t?又,可否改用 bit-wise operator 來改寫?
-->
算術:
```
*a = *a - *b;
*b = *a + *b;
*a = *b - *a;
```
邏輯運算:
```
*a = *a XOR *b
*b = *a XOR *b
*a = *a XOR *b
```
邏輯運算的好處是,可避免前述算術會遇到的 integer overflow,而且不限定位元數。
## Q3: 用 C 語言實做 `char *reverse(char *s)` 來反轉 NULL 結尾的字串,限定 in-place 與遞迴
參考實作 (都還可以大幅改進,只是列出來給大家看)
* [Day2](https://embedded2015.hackpad.com/GGI4IhFdLUW)
**C-style string reverse (遞迴 + in-place)**
* 先想想這個版本可用嗎? (以及對應的問題)
```C
void reverse (char *s) {
if (*s == ’\0’) return;
reverse (s+1);
printf ("%c", *s);
}
```