等级考试 百文网手机站

软考程序员辅导:程序员C语言新人常见问题

时间:2023-02-03 11:03:04 等级考试 我要投稿

软考程序员辅导:程序员C语言新人常见问题

  不知不觉,学习C语言也快一年了。虽然有C语言课,但是老师完全让我们自己看书,在自学的过程中,和周围同学交流中,以及后来在CSDN,BCCN,百度知道看帖回帖中,也看到许多C语言新人常遇到的问题与常犯的错误。为了让新人们少走弯路少碰壁,我便打算写下此文。以下是小编帮大家整理的软考程序员辅导:程序员C语言新人常见问题,仅供参考,大家一起来看看吧。

软考程序员辅导:程序员C语言新人常见问题

  1、程序画面一闪而过

  #include

  int main(void)

  {

  int iSignal; /*定义变量表示信号灯的状态*/

  printf(“the Red Light is 0,the Green Light is 1 ”); /*输出提示信息*/

  scanf(“%d”,&iSignal); /*输入iSignal变量*/

  if(iSignal==1) /*使用if语句进行判断*/

  {

  printf(“the Light is green,cars can run ”); /*判断结果为真时输出*/

  }

  if(iSignal==0) /*使用if语句进行判断*/

  {

  printf(“the Light is red,cars can’t run ”); /*判断结果为真时输出*/

  }

  return 0;

  }

  解析:在XP以上的系统用win-tc,dev-cpp等IDE编译运行此程序时,无论输入什么数字,结果都是一闪而过,因为程序执行完语句后就直接退出了。

  解决方案:这里有几个办法(1)

  在程序开头加上#include

  然后在程序末尾加上system(“pause”);

  此方法仅适用于MS-DOS,windows,不适用于*nix等系统(2)

  在需要暂停的地方加入一个或两个get);

  这种方法,实质上并不是暂停程序,而是让程序等待用户输入若干个回车。但是效果和暂停是相同的。(3)

  在程序开头加上#include

  在需要暂停的地方加入一个getch();,原理和上一种差不多。在win-tc里用得比较多。

  2、if,for,while的判断后直接跟;

  例如:

  #include

  int main(void)

  {

  int a;

  scanf(“%d”,&a);

  if (a == 123);////错误,if(a == 123)后面不应加上;,而应该紧跟着

  ////{ printf();}代码

  {

  printf(“ccc”);

  }

  else

  {

  printf(“ddd”);

  }

  get);

  return 0;

  }

  #include

  int main(void)

  {

  int n,i;

  printf(“please input a number>2:”);

  scanf(“%d”,&n);

  for(i=2;i   {

  if(n%i==0)

  break;

  }

  if(i   printf(“%d not a sushu ”,n);

  else

  printf(“%d is a sushu ”,n);

  return 0;

  }

  解析&解决方案:见注释

  3、漏头文件,main函数格式不规范。

  例如:

  main()

  {

  int a;

  scanf(“%d”,&a);

  printf(“input %d”, a);

  }

  解析:这段程序没有带上头文件stdio.h。即漏写了#include 。如果仅有scanf,printf函数的话,stdio.h是可以省略并可以正确运行的,但是这是非常不好的习惯。而main()这种写法,C89标准勉强充许这种形式,C99标准是不允许的。而void main(),至今仍未有任何标准考虑接受它。但是有些编译器的确允许。当然,这种写法广为流行,应该和老谭的书关系非常大。

  解决方案:用到的头文件应该用include包含进去。main()函数应该写成int main(void)这种形式,在main()函数尾部加上return 0;即

  #include

  int main(void)

  {

  int a;

  scanf(“%d”,&a);

  printf(“input %d”, a);

  return 0;

  }

  拓展:C语言中内存分配问题

  C语言的位字段是个比较有意思的特性。它的目的是在一个机器字中保存多个对象(每个对象占据若干bit),从而节省内存资源,同时又避免复杂的位运算。在此不再讨论位字段的具体语法,下面将研究位字段的存储特性。

  先说含有多个字段(field)的字(word)所占空间的规律——含有多个字段的字的大小是所有字段的类型中的最长的那个的倍数。但要确定究竟是最长类型的几倍则比较复杂,这要看是否需要考虑类型对齐问题(即一个字段能否跨越两个最长类型)。

  例1:

  struct word {

  char field1 : 1;

  char field2 : 2;

  int field3 : 4;

  };

  前两个字段都是char类型,第三个是int类型,所有类型中最长的是int类型。所以字的大小是int类型长度(即4字节)的倍数。而size of word的结果是4字节(即int的1倍),这是因为word的三个字段总共7位(1+2+4),小于int的32位,且不需 考虑类型对齐问题。

  例2:

  struct word {

  char field1 : 1;

  char field2 : 2;

  int field3 : 30;

  };

  与上例一样, 所有 类型中最长的是 int类型。所以字的大小是int类型长度(即4字节)的倍数。而size of word的结果是8字节(即int的2倍),这是因为word的三个字段总共33位(1+2+30),需要两个int的64位才能装下, 且不需 考虑类型对齐问题。

  例3:

  struct word {

  char field1 : 3;

  char field2 : 6;

  char field3 : 3;

  };

  所有 类型中最长的是 char类型。所以字的大小是char类型长度(即1字节)的倍数。在linux下size of word的结果是3字节(即char的3倍)。如果只考虑word的三个字段总共12位(3+6+3),需要两个char的16位即能装下,但是在linux的gcc实现下,第二个字段不能跨越两个char(为了对齐),所以三个字段各占一个字节。共3字节。但 一个字段能否跨越两个最长类型是由具体的实现决定的。

  其次,我们讨论word内各个field的存储,这个和具体的实现有关。有的是从左向右分配的,有的是从右向左分配的。这个没有规律可言。

  最后,对word中的field不能进行取地址操作,这是因为指针需要对齐。但可以对word进行取地址操作。

【软考程序员辅导:程序员C语言新人常见问题】相关文章:

C语言新人常见问题分析09-02

C语言新人常见问题与错误09-03

2016年计算机软考程序员模拟试题11-11

C语言考点辅导11-03

C语言辅导:C语言运算符表08-31

C语言程序的功能辅导11-01

C语言程序改错辅导05-03

C语言考前辅导题11-02

C语言考前辅导试题201711-04