讀了一下《C語言陷阱與缺陷》,開篇的一個介紹便是八進制。說起來,這個問題在我工作的過程中還確實是遇到過。
在C語言中,以0開頭的數字被識別為八進制。簡單寫一段代碼如下:
1 #include"stdio.h"
2
3 int var1 =123;
4 int var2 =0123;
5
6 int main(void)
7 {
8 PRintf("var1 =%d/n",var1);
9 printf("var2 =%d/n",var2);
10 return 0;
11 }
編譯運行結果:
GreydeMac-mini:oct greyzhang$ gcc oct.c
GreydeMac-mini:oct greyzhang$ ./a.out
var1 = 123
var2 = 83
從書中看到,有些編譯器會把0789這樣的數值也會按照八進制的轉換方式進行轉換。最終的結果為9*(8**0) + 8*(8**1) + 7*(8**2)計算出來。不過在標準C中,這是不允許的。簡單測試一下,修改代碼:
1 #include"stdio.h"
2
3 int var1 =789;
4 int var2 =0789;
5
6 int main(void)
7 {
8 printf("var1 =%d/n",var1);
9 printf("var2 =%d/n",var2);
10 return 0;
11 }
編譯與運行:
GreydeMac-mini:oct greyzhang$ gcc oct.c
oct.c:4:14: error: invalid digit '8' in octal constant
int var2 = 0789;
^
1 error generated.
查看一下編譯器的版本信息:
GreydeMac-mini:oct greyzhang$ gcc -v
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 8.0.0 (clang-800.0.42.1)
Target: x86_64-apple-darwin16.4.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
不像之前用過的gcc,這次沒有gcc的版本信息,不過里面的信息在使用Python的時候倒是看到過。
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.34)] on darwin
由以上信息可以看出,其實Mac里面提供的gcc編譯器并不是gcc而是一個兼容gcc功能的一個編譯器。
新聞熱點
疑難解答