您还未登录! 登录 | 注册 | 帮助  

您的位置: 首页 > 软件开发专栏 > 开发技术 > 正文

C语言你不可以错过的8个经典题目

发表于:2017-08-08 作者:Dawn_sf 来源:

  一下这些都是C语言中较为经典的例题,可以帮助大家在写程序中少走弯路,少出点BUG。
  1.  一下叙述中不正确的是(D)
  A.在不同的函数中可以使用相同名字的变量
  B.函数中的形式参数是在栈中保存
  C.在一个函数内定义的变量只在本函数范围内有效
  D.在一个函数内复合语句中定义的变量在本函数范围内有效
  (复合语句值函数中的成对括号构成)
  注:D项是有错误的比如我举个例子
#include
int man()
{
{
int a=10;
}
printf("%d",a);
return 0;
}
  这个如果再编译中,一定会出现,a未定义的错误的。
  2.
#include
#include
int main()
{
int i;
char acNEW[20];
for (i = 0; i < 5; i++)
{
acNEW[i] = '0';
}
printf("%d", strlen(acNEW));
system("pause");
return 0;
}

  问题是求输出结果: 这个答案应该不确定,因为呢它在为字符数组赋值时,并未赋   ''  但是strlen函数
  认为结束的标准就是 '' ,所以当它读到最后一位他会继续走下去,直到它遇到 '',因为后面是垃圾数据
  数据都是随机的所以strlen函数在读时直到遇到 '' 它才会停下来,所以答案是不确定的。
  3.全局变量可以定义在被多个.c文件包含着的头文件中?  错误
这个在编译时会报错的,但是如果使用static修饰就可以编译通过。
  4.
  在X86下,有这些程序:
#include
#include
int main()
{
union
{
short k;
char i[2];
}*s,a;
s = &a;
s->i[0] = 0x39;
s->i[1] = 0x38;
printf("%x", a.k);
system("pause");
return 0;
}

  这道题问的是输出的什么?这里牵扯的知识点 联合体和大小端存储,x86是小端存储,这种东西就得靠记了。。没办法大家都知道联合体空间公用对吧,short长度为2B,char i[2]长度也为2B.所以你的a.k虽然并未赋值,但是你等于输出了char i[2]数组中的内容,他们虽然名字不同现在他们内容是一样的。 这就考验我们大小端的概念了。
  接下来下面是我画的这道题的理解图:

  大家也知道读取数据一般是从高位开始读,比如一个数字 120 我们肯定是先看他最大的位对吧(高位)
  所以这道题的答案是 3839
  我再截图验证一下:

  5.求下列程序输出结果
#include
#include
int main()
{
unsigned char a = 200;
unsigned char b = 100;
unsigned char c = 0;
c = a + b;
printf("%d %d", a + b, c);
system("pause");
return 0;
}

  这道题主要考的是你对unsigned的理解,接下来我画一张图帮大家理解


  现在我说的对不对呢? 大家看看输出结果

  6.在x86,vc++ 6.0环境下,有下列程序
#include
#include
int main()
{
char c;
unsigned char uc;
unsigned short us;
c = 128;
uc = 128;
us = c + uc;
printf("0x%x", us);
us = (unsigned char)c + uc;
printf("0x%x", us);
us = c + (char)uc;
printf("0x%x", us);
system("pause");
return 0;
}


  做这道题前应该知道 char 的取值范围是-128 ~ 127,所以当你给uc赋128的时候,它真实的值为-128.

  具体我说的对不对? 看看运行结果。

  7.
#include
#include
struct tagAAA
{
unsigned char ucld : 1;
unsigned char ucpara : 2;
unsigned char ucState : 6;
unsigned char ucTail : 4;
unsigned char ucAvail;
unsigned char ucTail2;
unsigned char ucData;
}AAA_S1;
struct tagAAA2
{
unsigned int ucld : 1;
unsigned int ucpara : 2;
unsigned int ucState : 6;
unsigned int ucTail : 4;
unsigned int ucAvail;
unsigned int ucTail2;
unsigned int ucData;
}AAA_S2;
int main()
{
printf("%d  %d", sizeof(AAA_S1), sizeof(AAA_S2));
system("pause");
return 0;
}


  求AAA_S再分别为1字节对齐和四字节对齐的情况下,占用空间的大小:?
  答案为 6 16.
  这个问题就是位域的问题,我有专门关于结构体对齐的博客,不懂可以过去看一看。
  8.
#include
#include
#pragma pack(4);
int main()
{
unsigned char puc[4];
struct sagPIM{
unsigned char ucpim1;
unsigned char ucDate:1;
unsigned char ucDate1:2;
unsigned char ucDate2:3;
}*pstPimData;
pstPimData = (struct sagPIM*)puc;
memset(puc, 0, 4);
pstPimData->ucpim1 = 2;
pstPimData->ucDate = 3;
pstPimData->ucDate1 = 4;
pstPimData->ucDate2 = 5;
printf("%02x  %02x  %02x  %02x", puc[0], puc[1], puc[2], puc[3]);
system("pause");
return 0;
}


  这个主要还是位域,还有存储的一些关系了。
  因为按照位域存储,该结构体只需要2个字节即可存储全部内容,然后开始思考他内部的结构。
  下来我画一个图理解一下。

  再看看运行的结果吧 有图有真相。

  这些题目都很经典,可以帮助我们理解一些藏在深处的知识,各种坑各种容易犯的错误。。