深圳幻海软件技术有限公司 欢迎您!

C语言八进制学习小结

2023-03-25

读了一下《C语言陷阱与缺陷》,开篇的一个介绍便是八进制。说起来,这个问题在我工作的过程中还确实是遇到过。在C语言中,以0开头的数字被识别为八进制。简单写一段代码如下: 1#include"stdio.h" 2  3intvar1=123; 4intv

读了一下《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功能的一个编译器。

文章已被收录至官方知识档案
C技能树位运算八进制134665 人正在系统学习中