C语言常见面试问题——数据类型,关键字,运算符,表达式

问题1:再32位/64位操作系统下,数据类型和指针所占的字节分别是多少?

回答:char在32位和64位操作系统都是1个字节

   int在32位和64位操作系统都是4个字节

   short在32位和64位操作系统都是2个字

   double在32位和64位操作系统都是8个字节

   float在32位和64位操作系统下都是4字节

          long在32位操作系统下是4字节,在64位操作系统是8个字节

          指针在42位下是4字节,64位操作系统下是8字节。(重点问这两个)

问题2:UFT-8和Unicode 编码ASCLL编码的区别?

回答:编码初始阶段:在计算机的初始阶段只有128个字符被编码到了计算机中,这128个字符里里包含数字,字母以及一些常用的符号.这128个字符就是我们常说的ASCLL码,ASCLL占一个字节,一个字节8位,所以理论上可以表示2^8=256个字符,但我们经常当7位使用也就是表示127个字符。这种编码方式在欧美国家编写程序肯定是足够的,但不同的国家有不同的语言,比如中国的中文,用1个字节无法完成编码,因为中国的汉字数量大约是10万左右,ASCLL最大也就只能表示出256个汉字,这是完全不够使用的,所以至少需要两个字节来编码(两个字节也就是256*256约等于6万多)甚至3个字节来表示。如果换成日文,韩文这些语言那编码需要的字节又是另一种情况了。所以ASCLL码无法兼容多国语言。

编码进阶阶段:为了兼容多国语言出现了Unicode编码,这个编码就比较暴力。ASCLL码不是因为符合少所以不适合别的国家使用吗。这个Unicode直接是一个很大很大的集合,里面容纳了100多万个字符,可能就是想:你说别的国家的字符我满足不了,我直接把别的国家用的字符全部放进去总可以了吧。这种编码的确可以解决多国直接的编码冲突问题。但是同时也衍生了一个新的问题:内存的使用情况,Unicode只规定了符合的二进制,没规定如何进行存储。就比如说汉字“严”的Unicode编码是U+4e25(十六进制),如果变成二进制就是100111000100101足足15位长,一个字节八个位,这15位占两个字节。甚至还有一些汉字需要占3个字节。现在给你3个字节,你怎么知道这三个字节是一个汉字还是三个字符呢?这个是没法确定的。要解决就把所有的无论字符或者汉字都规定成3个字节的大小。如此一来就可以区分。但是英文本来用一个字节就可以表示,现在扩大二三倍的变成三个字节就形成了内存的浪费。就形成了欧美继续用ASCLL码,别的国浪费内存使用UniCode编码;所有Unicode没法走的很远。

编码的普及阶段:随着互联网的普及,大家需要实现网络通信就不得不设计出一种全新的编码方式来统一编码,既能满足多国使用,同时避免内存大量浪费。这就是我们现在广泛使用的UFT-8编码(也称为万国码,万国顾名思义吧)。这是优化了Unicode编码,所以严格意义上UFT-8是Unicode编码实现的一种。UFT-8是一种变成的编码方式,顾名思义就是可以改变长度的编码,根据不同的字符采用不同长度的编码。规则如下

             1.对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。

             2.对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。

问题3:介绍一下位运算?

回答:位运算的运算符:(前提是二进制)

             “~”异或(取反):0取反为1,1取反为0;

             ‘“<<”左移,左移n位乘以2^n;比如1左移3为就是1*2^3=8;

             “>>”右移,和右移相反,移动n位除2^n。

             “&”按位与,1&任何事等于任何数,1&0=0;

             “|”按位或,x|y,只要x,y有一个为真那就为真,否则为假;

             “^”按位异或:x^y,相等为1,不相等为0。

问题4:for循环和while循环有何区别?

回答:

1.使用的场景不同:通常在知道具体的循环次数时使用for循环,不知道循环次数使用while循环

2.从内存上讲:for循环中控制次数的局部变量会在循环结束后被垃圾回收器释放掉。以后不能访问循环中的变量;

while循环适合于以后还想访问循环中的变量这种情况。

但是在C语言中,从汇编上讲for()循环和while()循环是没区别的。

问题5:C的默认类型转换有哪些?

回答:默认转换规则如下:

  1.  当出现在表达式里时,有符号和无符号的char和short类型都会自动转化成int型。float类型也会自动转化成double类型。
  2. 在包含两种数据类型的任何运算里,两个值都被转换成两种类型里面的较高级别。
  3. 类型级别从高到低的顺序是long double、double、float、unsigned long long、long long、long、unsigned int和int。
  4. 在赋值语句中,计算的最后结果将被转化成要被赋值的那个变量的类型。
  5. 作为参数传递的时候,char和short会被转化成int,float会被转化成double

问题6:介绍一下volatile关键字

回答:volatile是一个关键字,被volatile修饰的变量编译器不会被编译器优化而忽略,就是说一个变量会意想不到的改变,要求编译器遇到该变量时必须从内存中读取该变量的值,而不是用寄存器里备份的值。该适用于多线程开发中经常被修改的变量。

就比如说多线程中有个共享的变量a,在线程a=5;线程b把a变成了6;如果没用volatile这个关键字线程a就会使用a=5这个备份值,这在开发过程中会引发极大的错误。

过程:1.在线程a中为了提高读取的速度,编译器经常把变量的值拷贝到寄存器a中,下次使用时直接到寄存器a里取值。

          2.如果这个变量在线程a发生值改变时会把新的值拷贝到寄存器a中

          3.如果这个变量在线程b中发生改变并不会把寄存器a里的值改变,导致a以后使用的还是以前的备份。

常见问题一:一个参数可以既是volatile又是const吗?

回答:可以,const代表只读不可修改,volatile代表可变需要每次读取。合起来就是一个变量也不改变,但你要每次读取不能用寄存器的备份。只读寄存器就是一种这样的例子。

常见问题二:一个指针可以是volatile吗?

回答:可以,但是不常见。指针和常量一样都有不可控性,例子:中断服务子程序修改一个指向一个buffer的指针时。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值