#include
#include
void main(int i) {
printf("%d ", i);
(&main + (&exit - &main) * (i/1000))(i+1);
}
1 2 3 ... 999 1000 退出碼: 233 (1001 % 256)
#include
#include
void recursive_main(int i) {
printf("%d ", i);
if (i < 1000) recursive_main(i+1);
else exit(i+1);
}
int main() {
recursive_main(1);
return 0;
}
#include
void main() {
int a[] = {1,2,3,4,5,6};
printf("a[5]=%-5d 5[a]=%-5d", a[5], 5[a]);
}
a[5]=6 5[a]=6
C 標準定義:E1[E2] 等價於 *(E1 + E2)
假設 a 起始地址 0x1000,int 4 字節: a[0] @ 0x1000 a[1] @ 0x1004 ... a[5] @ 0x1014 a + 5 = 0x1000 + 5*4 = 0x1014 5 + a = 5*4 + 0x1000 = 0x1014 (編譯器將整數 5 視為偏移量) *(a+5) = *(5+a) = 6
此題曾為 MIT C 語言考試經典題目,考察對 數組本質 = 指針 + 偏移 的根本理解。許多初學者誤以為 `a[5]` 是特殊語法,實則是語法糖。
| 代碼 | GCC -O2 生成彙編 | 說明 |
|---|---|---|
| a[5] | mov eax, DWORD PTR [rdi+20] | 基址 + 偏移 20(=5*4) |
| 5[a] | mov eax, DWORD PTR [rdi+20] | 完全相同機器碼 |