---
# System prepended metadata

title: C語言-C陷阱與缺陷

---

# C語言-C陷阱與缺陷
## 詞法陷阱
這裡指的詞法是如同符號一般，在C語言中這些符號單獨存在是沒有意義的，必須配合上下文。
1. =不等於==
= 是賦值操作(ex. a=b=c重複賦值)
```
if(x=y)
    break;//實際上是將y的值給了x然後檢查該值是否為0
```
2. &和|不同於&&和||
3. 貪心法(near-ambiguity)

```
a---b
含意等同於a-- - b
但不等同於a- --b
```
* 第一個"/*"會被視為是註解的開始
```
y = x/*p;    /* p 指向除數*/
編譯器會把第一個/*視為註解，直到遇到*/才停止，所以結果會變成y = x。
若要真的使x除以p 指向的值，需改成y = x / *p; 或 y = x/(*p); 
```
* =+ 可用來表 += (老編譯器)
```
a=-1; //會被視為 a = a -1;
如果你想表示的是a的值是-1，應寫成a = -1;
```

## 語法陷阱

### 理解函數聲明
```
(*(void(*)())0)();
```
任何C變量的聲明都由兩部分組成:類型以及一組類似表達式的聲明符。

```
float *g(),(*h)();
```
因為()優先權高於*，所以*g()等同於*(g())，g是一個函數，該函數的返回值類型為指向浮點數的指針。h是一個函數指針，h所指向函數的返回值為浮點類型。




```
```