精华内容
下载资源
问答
  • C语言一些基本问题

    千次阅读 2018-07-27 19:20:44
    一、小白在学习过程中有时会在程序中看到0u或是0ul等常量有后缀情况,如果没接触到C语言常量后缀话可能就有点疑惑~ 其中u为unsigned,l为long,f为float  C语言中常量默情况:整形默认为有符号int;浮点...

    一、小白在学习过程中有时会在程序中看到0u或是0ul等常量有后缀的情况,如果没接触到C语言常量后缀的话可能就有点疑惑~

    其中的u为unsigned,l为long,f为float

              C语言中常量的默情况:整形默认为有符号int;浮点型默认为double;如果整形常量大小超出int,默认自然就为long int;如果需要无符号整形常量的话就可以在常量后面加u或是U,如0u或是0U,同理可以在常量后面加ul或UL表示无符号长整形常量;而浮点型常量后缀只有f或F,l或L,没有u或U,因为浮点数一般都为有符号

    二、C语言的数据类型分为几种?

    一、基本类型
    1、整形类型:int ,short int,long int,long long int(C99),char,bool
    2、浮点类型:float ,double,双精度浮点型(float_complex,double_complex,long long_comples)
    二、枚举类型 enum
    三、空类型 void
    四、派生类型
    1、指针类型 *
    2、数组类型 []
    3、结构体类型 struct
    4、共用体类型 union
    5、函数类型

    三、unsigned在C语言中用法

    unsigned是用于修饰整数(int、long int、short int)和char数据类型的类型说明符,表示一个上述被修饰的数据类型是无符号数(第一个二进制位不代表符号的数)。
    拿char型举例:char为8位,signed char取值范围为[-128,127]共256个整数,unsigned char取值范围为[0,255]共256个整数。

    四、C语言中定义unsigned a;那么变量a的数据类型是什么?

    unsigned int类型,即无符号整型;
    整型的每一种都有无符号(unsigned)和有符号(signed)两种类型,在默认情况下声明的整型变量都是有符号的类型,如果需声明无符号类型的话就需要在类型前加上unsigned,只有unsigned时,表示unsigned int;
    现在的系统中,int一般都占4个字节,32位,表示的数组范围是-2147483648~2147483647,而无符号整型(unsigned int)不表示负数,所以表示的整数是有符号的整数的2倍,即0~4294967295。

    五、c语言的强制转换

    (type)<expression> 
      其中,type为类型描述符,如int,float等。<expression>为表达式。经强制类型转换运算符运算后,返回一个具有type类型的数值,这种强制类型转换操作并不改变操作数本身,运算后操作数本身未改变,例如: 
      int nVar=0xab65; 
      char cChar=char (nVar); 

      上述强制类型转换的结果是将整型值0xab65的高端两个字节删掉,将低端两个字节的内容作为char型数值赋值给变量cChar,而经过类型转换后nVar的值并未改变。

     

    展开全文
  • 数组中常见问题数组创建和初始化数组使用数组在内存中存储数组名含义 数组创建和初始化 1.一维数组创建和初始化 (1)使用变量作为一维数组初始化长度,也就是所谓变长数组。 变长数组是在C11标准中才...

    数组的创建和初始化

    1.一维数组创建和初始化
    (1)使用变量作为一维数组初始化的长度,也就是所谓的变长数组。

    变长数组是在C11标准中才开始使用的,因此不同的编译器对于变长数组有着不同的标准,也就是说,只有在C11标准的编译器下才能使用变长数组。

    (2)关于一维数组的初始化
    如果要省略数组的长度,就必须在函数的最开始对数组进行初始化,这样子编译器才会给数组一个长度。如果只是省略了数组长度,而不初始化,就无法进行编译。

    int arr[] = {1, 2, 3, 4, 5};//right
    int arr[];//error
    
    

    2.二维数组的创建和使用
    二维数组的初始化与一维数组是基本相同的,但是有一点要特别注意:
    二维数组省略数组长度时,只能省略行标,不能省略列标。如果省略列标的话,会让编译器对于二维数组的默认值无法确定。比如int arr[2][]={1,2,3,4}这样子定义二维数组,编译器不知道应该给一行放多少个元素,就会导致出错。

    int arr[3][4] = {1, 2, 3, 4};//right
    int arr[][4]={{2, 3} , {4, 5}};//right
    int arr[3][]={{1, 2}.{3, 4}.{5, 6}};//error
    

    数组的使用

    一维数组和二维数组都可以通过下标进行访问,但是数组的使用最常见的问题就是数组越界。
    但是数组越界在编译的时候是无法察觉的,但是在运行的时候就会出问题,得不到我们想要的结果。这个时候我们可以通过调试来找到问题,一般调试的时候出现与某个地址发生冲突的警告,如下图:
    在这里插入图片描述
    这种情况就属于数组越界,就需要在代码中去找到出错的地方。

    数组在内存中的存储

    我们应该都知道,一维数组在内存中的存储时连续的,但是二维数组的存储是怎么样的,难道是按照行和列来存储的吗?

    通过一张图我们就知道二维数组是怎么存储的:
    在这里插入图片描述
    二维数组在内存中其实和一维数组一样,也是连续存放的,并且随着下标的增大,地址也是从大到小。

    说到这里,又有一个问题:二维数组的首元素地址是什么呢,是第一个元素的地址?还是其他的呢?
    我定义了一个三行两列的二维数组,通过将数组首元素地址arr+1,我们看一下结果:
    在这里插入图片描述
    发现arr+1跳过了8个字节,也就是一行,因此二维数组的首元素地址指的是第一行的地址。

    数组名的含义

    数组名指的是数组首元素的地址,这个很多人都知道。但是有两个例外:
    (1)sizeof(数组名),这里的数组名指的是数组的地址,因此我们可以用sizeof(arr)/sizeof(arr[0])来计算数组长度。
    (2)&数组名,这里取出的是整个数组的地址,而不是数组首元素的地址。

    除了这两个,其他的任何情况,数组名都指的是数组名,这也就意味着,在将数组作为函数参数进行传递的时候,传递的也是数组首元素的地址,因此在以数组作为参数的函数的内部是不能计算数组的长度的,只能在外面计算好长度之后作为参数进行传递。

    展开全文
  • C 语言中的一些基本问题 1. Holle world 问题 实现 #include<stdio.h> Int main) { printf( Hello world!\n ;// 调用 stdio.h 头文件中的标准输出函数 return 0; } Ps:在 printf( Hello world!\n ;中 \n 的作用为...
  • 包括数据结构的一些基本算法和一些问题
  • 举例一些编程语言,以及他们各自特点?1.计算机程序,是指为了得到某种结果而可以由计算机等具有信息处理能力装置执行代码化指令序列,或者可以被自动转换成代码化指令序列符号化指令序列或者符号化语句序列...

     

    1. 什么是计算机程序?什么是编程语言?为什么需要编程语言?编程语言是用来干嘛的?举例一些编程语言,以及他们各自的特点?
      1.计算机程序,是指为了得到某种结果而可以由计算机等具有信息处理能力的装置执行的代码化指令序列,或者可以被自动转换成代码化指令序列的符号化指令序列或者符号化语句序列。同一计算机程序的源程序和目标程序为同一作品。
      计算机程序是由数据结构和算法构成的。
      2.编程语言处于各种原因被设计出来,各具自己的特点,适用的场景也不一样。3.编程几乎能干你不想干的任何事,比如说数据分析  数据采集  制定方案  如果把编程和机器人技术、人工智能技术结合它还可以做诸如:拖地 洗碗 打篮球
      4.例如C就不太方便处理字符串,java就很适合,而python由于带有丰富的数学工具包就常用于机器学习相关的开发。故而,是由于要求不同,产生了各种的编程语言,而为了使编程更便利,也促使着编程语言的发展,例如C++在C的优势基础上加入面向对象等内容。而现在的高级程序开发语言,在当前不也是新鲜物吗,汇编的历史已经很遥远了。
    2. 编辑好的程序到成为可以运行的可执行文件,要经历哪几个过程?
      C源程序到运行程序步骤:1.编辑:输入源程序并存盘(.C)。2.编译:将源程序翻译为目标文件(.OBJ)。3.链接:将目标文件生成可执行文件( .EXE)。4.运行:执行.EXE文件,得到运行结果。
    3. 现阶段为什么要学习C语言,而不是其他的编程语言?C语言有什么特点?
      C作为入门语言,其原因是C比较接近底层,又有一定的抽象性,虽然将来未必会使用它,但可以更了解计算机原理以及数据结构。可能对于大多数程序员来说没太大用处,但原理和数据结构能以计算机角度来思考程序问题,写出更高效的代码。
      C语言:C语言是介于汇编语言和高级语言之间的语言,属于高级语言,也称为中级语言,是集汇编和高级语言优点于一身的程序设计语言。
      C的特点
      1). 是一种结构化语言。层次清晰,便于按模块化方式组织程序,易于调试和维护。
      2). C语言的表现能力和处理能力极强。不仅具有丰富的运算符和数据类型,便于实现各类复杂的数据结构,它还可以直接访问内存的物理地址,进行位级别的操作。
      3). 由于C语言实现对硬件的编程操作,所以既可用于系统软件的开发,也适合于应用软件的开发。C语言还具有效率高,可移植性强等特点。因此广泛地移植到了各类计算机上,从而形成了多种版本的C语言。
      4). 由于C语言允许直接对位、字节和地址进行操作,能实现汇编语言的大部分功能。
      5). 目标代码质量高,程序执行效率高。
      总体上来说,C语言的优点是简洁、紧凑、使用方便、灵活、易于学习和应用。仅有32个关键字。9种控制语句,程序的书写形式也很自由。
    4. 什么是常量,什么是变量?都有哪些分类?
      在程序执行过程中,其值不发生改变的量称为常量。
      C语言中的常量可以分为:整型常量、实型常量和字符型常量和字符串常量,
      另外还有符号常量和有名常量.、
      整型,例如:-123, 0xff (十六进制), 022(八进制)
      实型, 例如:3.14, 3.14f (单精), 3.14lf (双精), 1.2e04(科学)
      字符常量, ‘A’
      字符串常量, “abc123”
      转义字符常量 ‘\0’ “\n”
      宏定义标识符常量 #define e 2.71
      程序中的 e 编译时会被2.71 替代,
      逻辑型常量 TRUE (实际上也是宏定义常量)
      C语言中的变量实际上就是一段虚拟内存区域。
      虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。目前,大多数操作系统都使用了虚拟内存,如Windows家族的“虚拟内存”;Linux的“交换空间”等。可以把虚拟内存当成一个大的字节数组。每一个元素占1个字节,每1个字节有1个地址。
      基本类型只有int,float,double,char四种。
    5. 标识符的命名规范是什么?
      1、必须用字母或下划线开头。例子:
      正确的:_22a, abc, avg3
      错误的:8Ta
      2、只能是字母、下划线、数字的组合,不能出现其他符号。例如¥_st,就是个错误的标识符,它出现了“¥”符号。
      3、大小写的含义是不同的,例如标识符 TEA和tea是不同的。
      4、标识符的名称不能是C语言中的关键字,关键字是具有特定含义的标识符,用户只能根据系统的规定使用它们。 例如 char 是关键字,用户的标识符就不能用它来命名。
      6. 什么是数据类型?数据类型分为哪些种类?每种数据类型占多少个字节大小?每种数据类型的取值范围怎么计算?思考:对于数据类型为什么要分类?
      char 字符型,占1个字节
      short 短整型,占2个字节
      int 整型,占4个字节
      long 长整型,占4个字节
      float 单精度浮点型,占4个字节
      double 双精度浮点型,占8个字节
      计算机里规定,8位二进制为一个字节,拿byte来说,一个BYTE类型的数据是占1BYTE(字节)的,那么他的取值范围为:00000000~11111111转换成10进制就是0到255,同样一个2BYTE的short int类型,他可装的为16位二进制即:0000000000000000~1111111111111111,也就是10进制的0~65535但是short类型他是有正负之分的,那么怎么表示负数呢?就是判断最高位,当最高位为0则为正,为1则为负。即:1000000010110001就是一个负数。其他的以此类推……
      分类:为了方便表示不同的东西,不容易出错,也同时提高效率。
    1. 字节大小是什么意思?怎么计算数据类型或者变量的字节大小?
      字节就是这个字符数组共有几个元素;一个字节的长度为8bit,数据的长度由数据的类型来定义。一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十进制。最小值0,最大值255。如一个ASCII码就是一个字节。 使用sizeof计算。 
    2. 什么是原码?什么是补码?什么是反码?正数的原码补码反码怎么表示,负数的原码补码反码怎么表示?
      反码: 反码是数值存储的一种,但是由于补码更能有效表现数字在计算机中的形式,所以多数计算机一般都不采用反码表示数。
      反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
      补码:在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
      反码表示法规定:正数的补码与其原码相同;一种简单的方式,符号位保持1不变,数值位从右边数第一个1及其右边的0保持不变,左边按位取反。也可以从反码推补码,就是在反码的基础上加1。
      正数的原码、反码、补码相同,
      负数的反码为:除符号位外,原码各位取反,反码加1,得负数的反码。
    3. 运算符有哪几种?每种运算符进行什么运算?
      算术运算符:用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、自增(++)、自减(–)共七种。
      关系运算符:用于比较运算。包括大于(>)、小于(<)、等于(==)、 大于等于(>=)、小于等于(<=)和不等于(!=)六种。
      逻辑运算符:用于逻辑运算。包括与(&&)、或(||)、非(!)三种。
      位操作运算符:参与运算的量,按二进制位进行运算。包括位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>)六种。
      赋值运算符:用于赋值运算,分为简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位运算赋值(&=,|=,^=,>>=,<<=)三类共十一种。
      条件运算符:这是一个三目运算符,用于条件求值(a?b:c)。
      逗号运算符:用于把若干表达式组合成一个表达式(,)。
      指针运算符:用于取内容(*)和取地址(&)二种运算。
      求字节数运算符:用于计算数据类型所占的字节数( sizeof() )。
      特殊运算符:有括号(),下标[],成员(→,.)等几种。
    4. C语言中有哪些控制语句,每种控制语句有什么功能?
      C语言9种控制语句
      ①if( )~else 条件语句
      ②for( )~ 循环语句
      ③while( )~ 循环语句
      ④do~while( ) 循环语句
      ⑤continue 结束本次循环语句
      ⑥break 中止执行switch或循环语句
      ⑦switch 多分支选择语句
      ⑧goto 转向语句
      ⑨return 从函数返回语句
    5. 搞清楚if...else,for循环,while循环,switch...case怎么执行的?
      ①for(表达式1;表达式2;表达式3){循环体} 表达式1,是初始化条件,如i=0。 表达式2,循环条件,满足就继续执行循环体,不满足就跳出循环。 表达式3,这个一般是改变循环条件的地方,如i++。
      ②while(表达式){循环体} 表达式的值为真(非0)时, 执行循环体语句。
      switch语句的执行流程是: 首先计算switch后面圆括号中表达式的值,然后用此值依次与各个case的常量表达式比较,若圆括号中表达式的值与某个case后面的常量表达式的值相等,就执行此case后面的语句,执行后遇break语句就退出switch语句;若圆括号中表达式的值与所有case后面的常量表达式都不等,则执行default后面的语句,然后退出switch语句,程序流程转向开关语句的下一个语句。
    6. break和continue有什么区别?
      break是结束循环。
      continue是结束本次循环。
      循环是有很多次的,break之后不再循环,continue结束本次循环后,再开始下一次的循环。
    展开全文
  • C语言程序设计的一些基本问题 2010年11月11日  color=red:5c9ae53a13][b:5c9ae53a13]C程语言序模式 [/b:5c9ae53a13][/color:5c9ae53a13]  一个语言的程序设计有一些常用的基本模式,这些模式是许多人长期工作...
    C语言程序设计的一些基本问题 
    2010年11月11日
      color=red:5c9ae53a13][b:5c9ae53a13]C程语言序模式 [/b:5c9ae53a13][/color:5c9ae53a13]
      一个语言的程序设计有一些常用的基本模式,这些模式是许多人长期工作的总结。在这个语言的程序中到处可见。对于一些典型问题,采用适当的模式是最容易把程序写好、写正确的。在这里我们将从简单到复杂,分门别类地列处一些C程序模式,供大家参考。这里列出的东西选自各种材料(包括《从问题到程序》书中)。这里列出的东西是很初步的。如果你认为有些东西也很重要,请给我们提示。
      在所有模式描述中,用$$符号括起来的一段段文字表示的是应该实际写出的东西。
      有关解释如果写了页数,请参考《从问题到程序》书中相关的页。
      --------------------------------------------------------------------------------
      简单输出程序模式:
      #include
      main () {
      $一个或几个输出语句,例如printf("Hello, world!\n");$
      }
      ----------------------------------------------------
      例:
      #include
      main() {
      printf("Welcome\n");
      printf("to\n");
      printf("Beijing!\n");
      }
      --------------------------------------------------------------------------------
      简单表达式计算模式:
      #include
      main() {
      printf($格式描述串$, $一个或几个表达式$);
      }
      ---------------------------------------------------
      注意:格式描述串中转换描述与参数个数一致,类型一致。
      --------------------------------------------------
      #include
      main() {
      printf("%f * %f = %f", 3.14, 6.5, 3.14 * 6.5);
      }
      --------------------------------------------------------------------------------
      简单算术计算函数定义:
      double fun ($一个或几个参数的说明$) {
      return $计算表达式$;
      }
      ----------------------------------------------------
      1,函数返回值类型根据需要写出,未必是double;
      2,参数写出类型和参数名的对,多个参数用逗号分隔;
      3,计算表达式描述如何由参数出发算出函数值;
      4,如果计算中需要用数学函数,应该在程序开始写一行
      #include
      ----------------------------------------------------
      例:
      double circle_area (double r) {
      return r * r * 3.14159265;
      }
      --------------------------------------------------------------------------------
      有函数定义的一般程序:
      #include …
      …… /* 函数定义写在这里(可以有一个或几个) */
      main () {
        …… /* 主程序体,通常包含对函数的调用 */
      }
      --------------------------------------------------------------------------------
      常用while循环形式:
      n = 1; /* 初始化循环中使用的变量 */
      while (n = 1E-6) {
      /* 循环中的计算应该影响“表达式”的值,否则将导致无限循环 */
      }
      --------------------------------------------------------------------------------
      常用for循环形式:
      for (n = 0; n
      #include
      /* 其他定义 */
      main () {
      /* 其他程序变量的定义 */
      double x;
      x = clock() / CLOCKS_PER_SEC;
      /* 需要计时的程序片段 */
      x = clock() / CLOCKS_PER_SEC - x;
      printf("Timing: %f\n", x); /* 输出形式自己确定 */
      }
      ---------------------------------------------------
      注意:不同系统的计时精度可能不同。有些系统还有非标准的计时功能。
      --------------------------------------------------------------------------------
      输入和处理由标准输入文件来的一系列字符
      int c;
      /* 其他定义或语句 */
      while ((c = getchar()) != EOF) {
      /* 对读入字符的处理 */
      }
      ---------------------------------------------------
      1,接收读入字符的变量(例如上面的c)必须用int类型;
      2,注意while条件中的括号,不能写错;
      3,应该写 #include
      --------------------------------------------------------------------------------
      最常见的数组操作
      for (i = 0; i next) {
      .... p->data ....
      }
      ---------------------------------------------------
      假设head是指向表头结点的指针。
      结点中的next成分是指向下一个结点的指针,data是数据。
      --------------------------------------------------------------------------------
      文件使用的基本模式
      FILE *fp;
      .... ....
      if ((fp = fopen($文件名$, $打开方式$)) == NULL) {
      /* 当文件打不开时的处理 */
      }
      ... ... /* 对文件的各种操作 */
      fclose(fp);
      ---------------------------------------------------
      执行文件打开操作之后,必须检查操作是否正常完成。
      --------------------------------------------------------------------------------
      使用里的bsearch和qsort,比较函数的基本写法
      1,确定被比较对象的顺序关系;
      2,比较函数总用两个const void* 参数;
      3,在函数开始时将参数正确转换到指向数组元素类型的指针;
      4,在第一个参数大于、等于、小于第二个时分别返回1、0、-1;
      5,注意使用方式。
      ---------------------------------------------------
      例子:假定被排序的是整数数组。定义比较函数:
      int icmp(const void *p, const void *q){
      const int *m = p, *n = q;
      return *m > *n ? 1 : (*m == *n ? 0 : -1);
      }
      使用:
      int *p, a[] = {5, 6, 3, 28, 23, 34, 7, 9, 6, 14}, k = 7;
      int main () {
      ... ...
      qsort(a, sizeof(a)/sizeof(int), sizeof(int), icmp);
      /* 这样,数组a的元素已经按照上升顺序排列好了 */
      p = bsearch(&k, a, sizeof(a)/sizeof(int), sizeof(int), icmp);
      /* 指针p将指向数组a中元素7的位置 */
      ... ...
      }
      ---------------------------------------------------
      请注意在这里如何为bsearch和qsort提供所要求的各个参数。
      li2002 回复于:2004-02-29 14:07:25 [color=red:d4dfff547d][b:d4dfff547d]写好C程序的10+大要点 [/b:d4dfff547d][/color:d4dfff547d]
      要写好C语言程序,最重要的当然是把要解决的问题分析清楚,设计好解决问题的方案和通过计算实现求解的过程,对问题的求解过程进行科学的结构化的分解。在此基础上进一步考虑如何写程序的时候,下面的建议可能有所帮助。
      这些建议中有些是一般性的,不仅仅对C语言程序设计有效;也有些是特别针对C语言程序设计的。这个表还会进一步修改和扩充,欢迎提出意见。
      --------------------------------------------------------------------------------
      1)应该特别注意程序的书写格式,让它的形式反映出其内在的意义结构。
      程序是最复杂的东西(虽然你开始写的程序很简单,但它们会逐渐变得复杂起来),是需要用智力去把握的智力产品。良好的格式能使程序结构一目了然,帮助你和别人理解它,帮助你的思维,也帮助你发现程序中不正常的地方,使程序中的错误更容易被发现。
      人们常用的格式形式是:逻辑上属于同一个层次的互相对齐;逻辑上属于内部层次的推到下一个对齐位置。请参考本课程的教科书或《C程序设计语言》(The C Programming Language,Brian W. Kernighan & Dennis M. Rirchie,清华大学出版社,大学计算机教育丛书(影印版,英文),1996。)
      利用集成开发环境(IDE)或者其他程序编辑器的功能,可以很方便地维护好程序的良好格式。请注意下面这几个键,在写程序中应该经常用到它们:Enter键(换一行),Tab键(将输入光标移到下一个对齐位置――进入新的一个层次),Backspace键(回到前一个对齐位置――退到外面的一个层次)。
      --------------------------------------------------------------------------------
      2)用最规范的、最清晰的、最容易理解的方式写程序。注意人们在用C语言写程序的习惯写法,例如教科书中解决类似问题时所使用的写法,《C程序设计语言》一书中有许多极好的程序实例。在这里有一个关于程序模式的相关网页,里面也列出了一些常用的模式。
      C语言是一个非常灵活的语言,你可能在这里用许多非常隐晦的方式写程序,但这样写出的程序只能是作为一种玩意儿,就像谜语或者智力游戏。这些东西可以用于消磨时间,但通常与实际无缘。在我们的C语言讨论组里提到过这种东西。
      --------------------------------------------------------------------------------
      3)在编程中,应仔细研究编译程序给出的错误信息和警告信息,弄清楚每条信息的确切根源并予以解决。特别是,不要忽略那些警告信息,许多警告信息源自隐含的严重错误。我们有许多办法去欺骗编译程序,使它不能发现我们程序中的错误,但这样做最终受到伤害的只能是自己。
      --------------------------------------------------------------------------------
      4)随时注意表达式计算过程和类型。注意运算符的优先级和结合顺序,不同类型的运算对象将怎样转换,运算的结果是什么类型的,等等。在必要的时候加上括号或显式的类型强制转换。
      C语言的运算符很多,优先级定义也不尽合理,很难完全记清楚,因此要特别注意。需要时查一查(不要怕麻烦,相关网页有运算符表),或者直接按照自己的需要加上几个括号。
      --------------------------------------------------------------------------------
      5)绝不去写依赖于运算对象求值顺序的表达式。对于普通二元运算符的运算对象,函数调用的各个实际参数,C语言都没有规定特定求值顺序。因此,我们不应该写那种依赖于特定求值顺序的表达式,因为不能保证它一定得到什么结果。例如下面的表达式和函数调用都是不合适的,很可能产生你预料不到的结果:
      scanf("%d %d", i++, a);
      m = n * n++;
      --------------------------------------------------------------------------------
      6)总保证一个函数的定义点和它的所有使用点都能看到同一个完整的函数原型说明。参看《从问题到程序》第103-107页。
      --------------------------------------------------------------------------------
      7)总注意检查数组的界限和字符串(也以数组的方式存放)的结束。C语言内部根本不检查数组下标表达式的取值是否在合法范围内,也不检查指向数组元素的指针是不是移出了数组的合法区域。写程序的人需要自己保证对数组使用的合法性。越界访问可能造成灾难性的后果。
      例:在写处理数组的函数时一般应该有一个范围参数;处理字符串时总检查是否遇到空字符'\0'。
      --------------------------------------------------------------------------------
      8)绝不对空指针或者悬空的指针做间接访问。这种访问的后果不可预料,可能造成系统的破坏,也可能造成操作系统发现这个程序执行非法操作而强制将它终止。
      --------------------------------------------------------------------------------
      9)对于所有通过返回值报告运行情况或者出错信息的库函数,都应该检查其执行是否正常完成。如果库函数没有完成操作(可能因为各种原因),随后的操作有可能就是非法的。这种错误也可能在程序运行中隐藏很长时间,到很后来才暴露出来,检查错误非常困难。
      --------------------------------------------------------------------------------
      10)在带参数宏的定义字符串中,一般应该给整个字符串和其中出现的每个参数都加括号。
      C语言预处理程序是个简单的文本替换程序,它根本不知道C语言的语法结构、优先级规则等。不写括号有时会产生我们不希望的代换结果。
      --------------------------------------------------------------------------------
      11)所有外部变量名字、所有函数名字,应该只靠前6个字符就能够互相区分。因为有些老的编译程序只关注这些名字的前6个字符。如果不注意这个问题,就可能引起隐含的连接错误。
      --------------------------------------------------------------------------------
      有关如何写好程序,如何将自己发展成为一个高水平的计算机工作者(真正的高级程序工作者,而不是那种拿证书的所谓“高级程序员”)还需要进一步学习和实践。如果希望向这个方向努力,我翻译的一本书可能对你有所帮助:
      《程序设计实践》,(The Practice Of Programming, Brian W. Kernighan & Bob Pike 1999)。机械工业出版社2000。这本书讨论了程序设计的许多重要的实践性问题,值得每个学过一个程序设计语言,有些程序设计经验,热爱或梦想在计算机领域工作的人阅读参考。在这里可以看到原书的前言和章节表。还有我为该书中文版写的译者序言。
      li2002 回复于:2004-02-29 14:08:22 [b:a1a43289f1][color=red:a1a43289f1]写坏C程序的几大诀窍[/color:a1a43289f1] [/b:a1a43289f1]
      如果你常常按照下面方式写程序,可以保证你的程序经常出错,你也经常头疼。
      --------------------------------------------------------------------------------
      1) 根本不管程序的格式,把程序写得老师也看不懂(自己当然更看不懂)。
      用格式迷惑自己也是弄坏程序的绝招。例如:
      if (a > 0)
      if (x == y) {
      ....
      };
      else {
      ....
      }
      请自己分析这到底是什么意思。
      --------------------------------------------------------------------------------
      2)不关心scanf或者printf中格式串和对应参数类型匹配的问题。例如(假设x, y是double类型,n是int类型)写:
      printf("%d, %f", x, n);
      scanf("%d %f", &x, &y, &n);
      这样可以保证输入输出总出现莫名其妙的问题,而且你和别人都找不到原因。
      --------------------------------------------------------------------------------
      3)写scanf时,在接收输入值的变量名之前不写&符号。
      这样做常常还可以顺便摧毁你所使用的计算机系统,给自己再多找点麻烦,有自制病毒之妙。
      --------------------------------------------------------------------------------
      4)写注释时随便地忘记几个结束符号。例如:
      x = y + 1; /* ha ha ha
      z = x * 2; /* fine fine fine */
      这样可以保证编译程序“按照你的指示”把你的一段代码吃掉。
      --------------------------------------------------------------------------------
      5)在比较的时候用 = 代替 ==。例如:
      if (x = y)
      z = x + 5;
      这可以保证x和y一定相同,而是否执行赋值就看你的运气了。
      --------------------------------------------------------------------------------
      6)定义局部变量后,不初始化就使用。例如:
      int fun(int n) {
      int m;
      return n + m;
      }
      如果对指针变量这样做,常可以带来隐秘的破坏效果,让最有经验的人也难找到毛病的根源。例如写:
      int fun(int n) {
      int* p;
      *p = n*n;
      return *p + n;
      }
      这样做有时可以顺便摧毁你用的计算机系统,再给自己多找点麻烦。
      --------------------------------------------------------------------------------
      7)函数定义为有返回值的,但(有时)却不去写return(101-102页)。
      这样做可以保证你的程序不时出现古怪行为。
      --------------------------------------------------------------------------------
      8)不关心变量的范围,例如对循环次数很多的变量用 short 类型做循环等。
      这样做可以得到不明不白的结果;有时还可以使程序永不停止,直到你用的计算机累死为止。
      --------------------------------------------------------------------------------
      9)用sizeof运算符去计算函数的数组参数的大小,或者计算字符串的大小。
      这样做一般可以保证计算结果错误,出现的问题难以预料。
      --------------------------------------------------------------------------------
      10)不写函数原型说明,采用过时原型说明形式(103-107页),或者故意写错误的原型说明。
      这样做一般都能骗过编译程序,阻止它帮助你检查程序错误,使你自己麻烦多多。
      --------------------------------------------------------------------------------
      11)定义带参数宏的时候尽量节约括号,省得写起来麻烦。
      这样可以保证在使用宏的地方不时地出现隐含错误,就像埋下的地雷,检查源程序也很难发现。
      --------------------------------------------------------------------------------
      写坏C程序的秘诀还有很多,我们将在这里总结交流如何写坏程序,使自己头疼,给老师找麻烦的经验。欢迎大家投稿。来函请发“坏程序经验”。
      li2002 回复于:2004-02-29 14:09:34 [color=red:84e1d7a567][b:84e1d7a567]查找和排除程序编译中的错误(主要是语法错误) [/b:84e1d7a567][/color:84e1d7a567]
      (在建设和不断修改中,欢迎提出意见)
      学生: 怎么办啊?我的程序编译通不过,出了这么多错误信息!
      老师: 不要慌!你先集中力量找出第一个错误的真正原因,并将这个问题解决掉。然后再分析后面的错误。如果看不清楚下面的问题,那么就重新编译一下,并按照同一个方式重复去做。
      --------------------------------------------------------------------------------
      不能通编译过的程序实际上还不是合法的程序,因为它不满足C语言对于程序的基本要求。
      检查语法错误的第一要义:集中力量检查系统发现的第一个错误,弄清并改正它。
      在编译过程中系统发现的错误主要有两类:基本语法错误和上下文关系错误。这些错误都在表面上,可以直接看得见。也是比较容易弄清,比较容易解决的。关键是需要熟悉C语言的语法规定和有关上下文关系的规定,按照这些规定检查程序正文,看看存在什么问题。
      编译中系统发现错误都能指出错误的位置。不同系统在这方面的能力有差异,在错误定位的准确性方面有所不同。有的系统只能指明发现错误的行,有的系统还能够指明行内位置。
      一般说,系统指明的位置未必是真实错误出现的位置。通常情况是错误出现在前,而系统发现错误在后,因为它检查到实际错误之后的某个地方,才能确认出了问题,因此报出错误信息。要确认第一个错误的原因,应该从系统指明的位置开始,在那里检查,并从那里开始向前检查。
      系统的错误信息中都包含一段文字,说明它所认定的错误原因。应该仔细阅读这段文字,通常它提供了有关错误的重要线索。但也应该理解,错误信息未必准确,有时错误确实存在,但系统对错误的解释也可能不对。也就是说,在查找错误时,既要重视系统提供的错误信息,又不应为系统的错误信息所束缚。
      发现了问题,要想清楚错误的真正原因,然后再修改。不要蛮干。在这时的最大诱惑就是想赶快改,看看错误会不会消失。但是蛮干的结果常常是原来的错误没有弄好,又搞出了新的错误。
      另一个值得注意的地方:程序中的一个语法错误常常导致编译系统产生许多错误信息。如果你改正了程序中一个或几个错误,下面的弄不清楚了,那么就应该重新编译。改正一处常常能消去许多错误信息行。
      --------------------------------------------------------------------------------
      解决语法错误
      常见语法错误:
      1)缺少语句、声明、定义结束的分号。
      2)某种括号不配对。C语言中括号性质的东西很多,列举如下:
      ( ), [ ], { }, ' ', " ", /* */
      在不同位置的括号不配对可能引起许多不同的错误信息。
      3)关键字拼写错误。
      较难认定的典型错误:
      1)宏定义造成的错误。这种东西不能在源程序文件中直接看到,是在宏替换之后出现的。常见的能引起语法错误的宏定义错误:宏定义中有不配对的括号,宏定义最后加了不该有的分号,……
      --------------------------------------------------------------------------------
      解决上下文关系错误
      1)变量没有定义。产生这个问题的原因除了变量确实没有大意外,还可能是变量的拼写错误,变量的作用域问题(在不能使用某个变量的地方想去用那个变量)。
      2)变量重复定义。例如在同一个作用域里用同样名字定义了两个变量,函数的局部变量与参数重名等。
      3)函数的重复定义。可能是用同一个名字定义了两个不同的函数。或者是写出的函数原型在类型上与该函数的定义不相符。有时没有原型而直接写函数调用也可能导致这种错误信息,因为编译程序在遇到函数调用而没有看到函数原型或函数定义时,将给函数假定一个默认原型。如果后来见到的函数定义与假定不符,就会报告函数重复定义错误。
      4)变量类型与有关运算对运算对象或者函数对参数的要求不符。例如有些运算(如 %)要求整数参数,而你用的是某种浮点数。
      5)有些类型之间不能互相转换。例如你定义了一个结构变量,而后要用它给整数赋值。系统容许的转换包括:数值类型之间的转换,整数和指针之间的转换,指针之间的转换。其余转换(无论是隐含的,还是写出强制)都不允许。参见《C语言程序设计》(K&R)197-199页。
      --------------------------------------------------------------------------------
      如何看待编译警告
      当编译程序发现程序中某个地方有疑问,可能有问题时就会给出一个警告信息。警告信息可能意味着程序中隐含的大错误,也可能确实没有问题。对于警告的正确处理方式应该是:尽可能地消除之。对于编译程序给出的每个警告都应该仔细分析,看看是否真的有问题。只有那些确实无问题的警告才能放下不管。
      注意:经验表明,警告常常意味着严重的隐含错误。
      常见警告:
      1)(局部自动)变量没有初始化就使用。如果对局部指针变量出现这种情况,后果不堪设想。对于一般局部自动变量,没有初始化就使用它的值也不会是有意义的。
      2)在条件语句或循环语句的条件中写了赋值。大部分情况是误将 == (等于判断)写成 = 了。这是很常见的程序错误,有些编译程序对这种情况提出警告。
      li2002 回复于:2004-02-29 14:10:59 [b:c2bcd31476][color=red:c2bcd31476]查找连接错误 [/color:c2bcd31476][/b:c2bcd31476]
      (在建设和不断修改中,欢迎提出意见)
      学生: 我的程序编译没错,为什么系统说不能连接,不能产生可执行程序?
      老师: 那说明程序的外部变量、函数的名字方面出了些问题。这些问题比较简单,但修改时也要特别小心,不要把其他正确的东西改错了。
      --------------------------------------------------------------------------------
      连接是编译完成后的下一个程序加工步骤。在这个步骤中,连接程序的工作对象是:1)由你所编写的程序源文件产生的目标文件(一个或者几个);2)语言系统提供的一些目标代码文件,包括基本运行模块(也称为运行系统)和库文件。
      连接程序的工作包括两部分:1)将所有需要的目标代码拼装到一个文件中(这是最后可执行文件的基础);2)将外部对象的使用和定义连接起来,包括所有函数调研的实际调用代码的建立,正确设置所有外部变量的使用。
      连接错误有两类:
      1)缺定义。当程序中出现对某个外部对象的使用,而连接程序找不到对应的定义时,将产生这个错误。
      2)重复定义。当被连接的各个部分中出现某个名字的多个定义时,将产生这个错误。
      --------------------------------------------------------------------------------
      缺定义错误的常见原因:
      1)名字拼写错误。例如将 main 拼写为 mian,连接时就会产生缺定义的连接错误。因为程序的基本允许模块里有一个对 main 的调用,连接程序需要找它的定义而没有找到。调用自己的函数名字写错的情况也很常见。
      2)真的就是没有定义。例如你想调用一个非标准的C库函数,而你所用的系统里没有。或者是你要调用的自定义函数忘了定义。有时也有这样的情况,系统里有这个函数,但需要特别设置才能够找到它(因为函数放在某个非标准的库文件里),解决这种问题需要查阅有关的系统手册,这里不讨论了。
      如果真是缺了定义,那就只能设法补上。
      --------------------------------------------------------------------------------
      重复定义错误的常见原因:
      1)重复定义可能是自己(在不同源文件里)定义的两个东西采用了同样的名字,或者是自己定义的东西恰好与C语言系统内部定义的某个东西重名。这时都需要改名字。
      2)可能你在一个文件里定义了某个变量,而在另一个文件里需要使用它,但却忘记在变量说明前加 extern 关键字。
      3)有些连接程序只按照外部名字的前X个(常见的是前6个,这是C语言标准的最低要求)字符考虑连接问题。如果你程序里有多个对象前6个字符相同,或者恰好某个对象名字的前6个字符与编译系统所提供模块里的某个名字相同,那么就可能出问题。
      解决办法:找出出现冲突的名字,系统地将它们改为另外的名字。请注意,在改名字时一定要特别小心,如果更改不当或者不彻底,就会引进错误(某个使用实际用的可能不是你所希望的东西)。
      利用C语言的static功能,将所有只在一个文件里使用的外部对象定义为static,可以避免自己在多个文件里定义的东西互相冲突(即使是用同样的名字,如果都是static也不会冲突,因为static的外部名字只在本文件里可以看见)。
      li2002 回复于:2004-02-29 14:12:02 [color=red:8514d144e8][b:8514d144e8]查找和排除程序运行中发现的错误(debugging) [/b:8514d144e8][/color:8514d144e8]
      (在建设和不断修改中,欢迎提出意见)
      学生: 我的程序编译连接都通过了,为什么运行中系统还会报出错误?
      老师: 这一般说明你的程序在某些方面做了违反C语言规定(违规)的事情,而这种情况是在运行的动态过程中出现的。你现在用的系统能够检查出这个问题,所以就报了错误。
      学生: 我的程序编译运行都正常,怎么就是结果不对?(怎么就不能完成我想做的事情?)
      老师: 出现这种问题的可能原因很多,解决起来也比较困难些。你最好首先认真读一读你的程序,想一想它可能存在什么问题,然后再…………
      --------------------------------------------------------------------------------
      从外面看,运行时发现的错误可以分为两类:一类是系统能够检查并产生信息的错误;另一类是系统不检查也不产生运行错误信息的错误。不同的系统在检查哪些问题方面可能差别很大。
      抽象地看,运行时发现的程序错误可以分为两类:一类是程序中某些地方执行了违反语言规定的操作,由此产生某种影响导致程序出错;另一类问题出在程序本身,例如程序的算法不对,或者是程序写的不对(没有表达你所想说的东西),这些一般称为逻辑错误。这种问题分类只有提示性,并不是绝对的,有时也很难划分清楚。
      --------------------------------------------------------------------------------
      违规型的错误
      最常见的违规错误是非法地址访问。有些系统(例如DOS)对这类错误完全不检查,可能造成很严重的后果,常常会破坏系统,造成死机或者非常奇怪的系统行为。有些系统(例如 Windows NT)管理比较严格,可能确认程序非法访问而将其kill掉。
      1)对空指针、未初始化的指针的间接访问。这涉及到对指针值所确定地址的访问,常常是非法的。
      2)把整数或者其他变量当作指针使用,造成访问非法地址的情况,例如,假定 n 和 x 分别是整的和双精度的变量;下面语句将它们的值当作指针值使用,形成非法访问:
      scanf("%d %lf", n, x);
      3)数组的越界访问。效果无法预料,有时可能被系统检查出来,有时可能检查不出来,造成奇怪的程序行为。
      --------------------------------------------------------------------------------
      逻辑型的错误(语义错误)
      一类常见错误是计算溢出、除零等。C语言对于无符号数的上溢出(超出表示范围)自动丢掉最高位,对于一般整数类型、浮点数类型,语言的标准本身并没有明确规定,不同C语言系统的处理方式可能不同。大部分C语言系统忽略整数溢出的情况。无论如何,出现溢出往往会造成结果与预想的东西不符。
      --------------------------------------------------------------------------------
      排除程序错误的基本方法
      --------------------------------------------------------------------------------
      排错系统(debugger)的使用,原理、技术、方法。局限性。
      --------------------------------------------------------------------------------
      参考材料:《程序设计实践》第5章:排错。
      li2002 回复于:2004-02-29 14:13:21 [b:29e82c8b11][color=red:29e82c8b11]ANSI C 与 K&R C [/color:29e82c8b11][/b:29e82c8b11]
      C语言由Dennis M. Ritchie在1973年设计和实现。从那以后使用者逐渐增加。到1978年Ritchie和Bell实验室的另一位程序专家Kernighan合写了著名的《The C Programming Language》,将C语言推向全世界,许多国家都出了译本,国内有一些C语言书就是这本书的翻译或者编译。由这本书定义的C语言后来被人们称作 K&R C。
      随着C语言使用得越来越广泛,出现了许多新问题,人们日益强烈地要求对C语言进行标准化。这个标准化的工作在美国国家标准局(ANSI)的框架中进行(1983-1988),最终结果是1988年10月颁布的ANSI标准X3.159-1989,也就是后来人们所说的ANSI C标准。由这个标准定义的C语言被称作ANSI C。
      ANSI C标准很快被采纳为国际标准和各国的标准。国际标准为ISO/IEC 9899-1990,中国国家标准GB/T 15272-94是国际ISO标准的中文翻译。
      ANSI C标准化工作的一个主要目标是清除原来C语言中的不安全、不合理、不精确、不完善的东西。由此也产生了ANSI C与K&R C之间的差异。从总体上看,这些差异反应的是C语言走向完善、走向成熟。
      --------------------------------------------------------------------------------
      ANSI C 对 K&R C 的修订
      (本段根据《C Programming Language》和C语言标准整理。不求完整,希望列出最常见的差异)
      对于源文件内部的标识符,有效的最小长度扩充到31个字符。文件间连接时,标识符的最小有效长度仍然为6个字符。(许多实现都支持更大的长度)
      增加了几个新关键字:void,const,volatile,signed,enum。抛弃了老关键字entry。
      在换意字符 \ 之后写非规定的序列,其作用确定为无定义。
      规定8和9都不是八进制数的合法字符。
      引进了数的后缀字符:整数的U和L,浮点数的F和L。
      规定连续出现的字符串常量将被拼接在一起。
      引进了“宽字符”的概念。
      将字符也确定为带符号(signed)和不带符号(unsigned)的。
      丢弃了long float(原来作为double的同义词)。
      引入了void类型,用 (void*) 表示通用指针的类型(过去人们通常用 (char*))。
      对算术类型规定了最小表示范围。要求每个C语言系统用头文件(和)说明实现中的具体规定。
      引进了枚举定义enum。
      采用了来自C++的类型修饰符,如const。
      规定字符串常量是不可修改的。
      改变了算术类型的隐含转换规则。
      删去了一些过时赋值运算符,如 =+。规定赋值运算符都是基本单词,如 += 之间不能有空格分隔。
      引进了与一元 - 运算符对应的一元 + 运算符。
      指向函数的指针可以直接放在函数调用的位置,不必显式地写间接操作。
      允许结构地整体赋值,作为函数参数和返回值传递。
      允许将取地址运算符作用于数组,得到的是指向有关数组的指针。
      标准规定 sizeof 运算符的返回值为 size_t 类型(某个无符号整型),这一类型在标准头文件里定义。同时在那里定义的还有 ptrdiff_t 类型,它是指针减运算的结果类型。
      规定取地址运算符不能作用于 register 变量。
      规定移位表达式的类型为其左运算对象的类型。
      允许建立指向过数组末元素一个位置的指针,以及对它的算术运算和关系运算。
      (从C++)引进了包含参数类型的函数原型概念,引进了变长参数表函数的概念。仍允许老的形式,但仅仅是作为过时形式保留。
      标准规定任何局部声明的作用域仅仅是当前的块(复合语句)。
      规定函数参数作为加入函数体(复合语句)的声明,因此不能用变量声明去覆盖。
      有关名字空间的规定:所有结构、联合和枚举标记在一个名字空间里,标号是另一个名字空间。
      联合变量在定义时也可以初始化,规定初始化其第一个成分。
      自动结构、联合和数组也可以初始化,但限制其初始化方式(其中只能包含常量表达式)。
      带大小描述的字符数组也可以用大小与之相同的字符串常量初始化(结束的 \0 被删除)。
      开关语句的控制表达式和case标号可以是任何整型的(包括字符类型)。
      li2002 回复于:2004-02-29 14:14:37 [b:2341ca8ff7][color=red:2341ca8ff7]Turbo C(TC)系统的浮点连接错误 [/color:2341ca8ff7][/b:2341ca8ff7]
      用TC-2.0系统编写小的C程序,如果程序里用到浮点输入,有时运行中会出现下面错误信息:
      scanf : floating point formats not linked
      Abnormal program termination
      这个错误信息的意思是:scanf的浮点格式转换程序没有连接。
      TC开发时(80年代)DOS下的存储资源紧缺,因此TC在编译时尽量不加入无关部分。在没发现需要做浮点转换时,就不将这个部分安装到可执行程序里。但有时TC不能正确识别实际确实需要浮点转换,因此就会出现上面错误。
      解决方法:设法告诉TC需要做浮点数输入转换。下面例子里增加了一个double变量并用它输入。
      大程序里由于变量很多,只要有了线索,TC就会把浮点转换连上,因此反而不常遇到这个问题。
      --------------------------------------------------------------------------------
      /* 能导致出现运行错误的程序例子。
      在这里用的一个结构数组,结构里面有double类型的成分,TC不能正确识别和处理,因此会导致上述问题。*/
      #include
      #define NUM 4
      struct entry {
      int inum; /* 商品编号 */
      int pc; /* 件数 */
      double price;/* 价钱 */
      } st[NUM]; /* st是个商品表 */
      int main () {
      int i;
      for (i = 0; i
      #define NUM 4
      struct entry {
      int inum;
      int pc;
      double price;
      } st[NUM];
      int main () {
      int i;
      double x;
      for (i = 0; i
      
      
    展开全文
  • C语言程序设计的一些基本问题[转]

    千次阅读 2010-07-23 08:50:00
    C语言程序设计的一些基本问题
  • 不知不觉已经10点多了,而此时我有只是沉下心思考,快到9月了,该把自己初始化为0,从头复习了。  先说全局变量,定义全局变了很简单却又很危险。简单在于它定义在文件里独立于一切函数外面变量,危险在于...
  • C语言的知识梳理1.关于基本整型的字节问题(int型)2.常见的ASCII码3.C语言运算符优先级4.有关数据输入输出的概念 1.关于基本整型的字节问题(int型) 编译系统分给int型数据2个或者4个字节(由具体的C编译系统自行决定 ...
  • c语言常见问题

    2012-02-08 17:56:57
    c语言中常出现的问题及解决方案,有解析和代码。 当你开始编写C程序时,你可能对C语言的一些基本问题感到困惑,如C语言所使用的约定、关键字和术语等。此资源可以帮助解决一些困惑。
  • C语言常见问题.doc文档。主要描述C语言一些基本要素。当你开始编写C程序时,你可能对C语言的一些基本问题感到困惑,如C语言所使用的约定、关键字和术语等
  • 在大学时候使用c语言基本上都是算法编程,简单易懂,到了实习时候才发现c语言代码我们学真是九牛一毛,还是要多学多用,下面记录仅仅是自己不太懂东西,写在博客上也只是为了让自己可以在不懂时候多看...
  • C语言一些细节问题

    2018-10-14 22:31:31
    1、在对scanf()函数传参时候,数值和字符类型变量前...2、C语言数据类型分类:基本数据类型:字符型、整型、单精度、双精度浮点型、 中级数据类型:数组、指针、结构体、联合体、枚举。 3、float和doub...
  • C语言结构的基本使用

    千次阅读 2020-05-22 19:13:51
    一个结构中包含每个数据分量都有名字(类似于Java类),这些数据分量称为结构成员或者结构分量,结构成员可以是C语言任意变量类型,开发时可以使用结构类型来创造适合于问题的数据集合。像数组和指针一样,结构...
  • 本章主要描述C语言一些基本要素。当你开始编写C程序时,你可能对C语言的一些基本问题感到困惑,如C语言所使用的约定、关键字和术语等。本章将回答这方面你经常会遇到的一些问题。
  • 1、整型常量可以带正负号,也可以不带。实型数都有符号 2、二进制:B 八进制:O 十进制:D 十六进制:H ...5、“a”ASCII码97,“A”ASCII码65 6、转义字符:“\t”-制表,“\n”-回车换行,“\b”...
  • 懂,都是一些基本问题: 1,buff+28和buff[28]不一样。 2,16进制转ASCII。 3,在网络上传输 , 数字,字符,ASCII,char类型数据,int类型数据。 4,就是说,我在这里接收到可以是任意类型指针,假如...
  • C语言编程中重要问题

    千次阅读 2006-03-23 14:53:00
    当你开始编写C程序时,你可能对C语言的一些基本问题感到困惑,如C语言所使用的约定、关键字和术语等。本章将回答这方面你经常会遇到的一些问题。 例如,switch语句是最常用的一种C语言构件,本章将回答与它有关的三...
  • 最忙碌一周已然结束,疲惫之余想和大家聊一聊对C语言中结构体认识。水平不足,如有问题请大家指正。 一、对结构体理解 我们知道C语言中有基本数据类型: 1、整(数)型: int:基本整型,用于存储整数,占4...
  • 2.在C语言中,数据类型可分为:基本数据类型,构造数据类型(数组类型、结构类型、联合类型),指针类型(其值用来表示某个量在内存储器中地址),空类型四大类。 3.指数形式 由十进制数,加阶码标志“e”或...
  • 当你开始编写C程序时,你可能对C语言的一些基本问题感到困惑,如C语言所使用的约定、关键字和术语等。本章将回答这方面你经常会遇到的一些问题。 例如,switch语句是最常用的一种C语言构件,本章将回答与它有关的三...
  • 我们在学习C语言的时候,在学会一些基本的语法,会做一些能概括所学知识的应用就以为自己已经完全会了这一部分,实际上这是不对的,我们完成的功能都只是很直接的运用知识点去操作,想要完成更高难度的任务就必须有...
  • 处理时间是编程中经常遇到的问题C语言中提供了一些时间处理函数,在此记录下一些基本的用法。下面这篇文章主要给大家介绍了C语言中关于时间基本用法相关资料,需要朋友可以参考借鉴,感兴趣朋友们来一起看...
  • scanf函数 最近用到了c,很久之前学,忘记了好多,只能是不会就打开书看看继续写,感叹c就是...所以在输入基本类型时候都是要用到&符号;但是数组类型在c中是按照地址来处理,所以不用& 格式说明:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,176
精华内容 470
关键字:

c语言的一些基本问题

c语言 订阅