声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4255830.html

数组... 1
extern. 3
“定义”与“声明”... 3
变量命名规则... 3
数据类型... 3
算术类型提升与转换规则... 5
void. 5
\000、\xhh. 5
ANSI C中所有转义字符... 6
\0. 6

数组

局部数组定义时如果未指定长度,又未指定数组内容,则编译报错。但全局的好像可以在定义时不指定长度的情况下也不指定数组内容,但编译时会有警告,内存全清零,并可以对它进行某个元素的读写,但如果下标索引过大可能引起内存读写错误。
 
在定义数组时可以不指定数组长度,而只指定数组内容。也可既指定长度,又指定数组内容。
 
C语言中的定义的多维数组是定长的,不像Java那样可以在定义时不指定多维数组长度,而指定不同长度的维度内容,如果C中如此定义,则列的长度为某个维度中最长的长度。
 
如果在C语言要定义多维不定长的数组,则只能通过指针的形式来指定多维数组,即数组里的非第一维采用指针形式定义,如字符串指针数组。
 
C语言中的字符串可以使用一个最末元素为’\0’的空字符来定义。也可将一个字符串直接赋值给一个数组。
 
定义多维数组时,除了第一维不需要指定大小外,其他维都需要指定数组大小。
 
Java在声明一个数组时,不能指定数组大小,这与C不同,在new时可以省略后面的维度大小,不能省略前面而指定后面大小: int  b[][][]= newint[1][][];也可以这样:int a[][][] = { { { 1 }, { 2, 3 } } };,C语言只允许以后面这样形式定义: int a[][1][1] ={{{1}}};,只允许省略第一维大小(在有初始化的情况下,如果定义时未马上初始化,则第一维也不能省略),也可都不省略,但最好别省略,且初始化时定义时大小与初始化的大小一致,否则容易出问题。
 
如果初始化值的个数少于数组元素的个数,剩余的元素被自动初始化为(多维数组也是这样),例如,可以用下面的语句将数组n的元素初始化为0:int a[10]={0};。但千万要记住:数组的元素不会被自动初始化为0——程序员至少要把第一个数组元素初始为0才能使剩下的元素自动初始化为0。
 
C语言不检查数组是否越界。
 
如下的数组声明会导致语法错误,因为数组元素只有5个而初始化值却有6个:int a[5] = { 1, 2, 3, 4, 5, 6 };,初始化值列表中的初始化值个数多于数组元素的个数是一种语法错误。
 
如果在声明带有初始化值列表的数组时省略数组的大小(如果没有初始化列表则不能省略),那么数组元素的个数就是初始化列表中的元素个数,例如:int a[] = { 1, 2, 3, 4, 5, 6 };,建立一个有6个元素的数组。
 
声明为static的数组是在编译时一次性初始化的,如果程序员没有明确地初始化静态数组,那么编译器把它初始化为0。
 
数组实际上就是数组的第一个元素的地址:
int main(int argc, char * argv[]) {
    char array[5];
    printf("%p \n", array);//0022FF4B
    printf("%p \n",&array[0]);//0022FF4B
    return 0;
}
转换说明符。
 
在将多维数组做为函数的参数时,第一个下标也是不必要的(如果写了编译器也会忽略掉),但是要给出其后其他所有的下标,因为编译器要用这些下标确定这些元素在内存中的位置,不管数组的下标有多少个,所有的元素都是在内存中连续存放的,所以编译要根据第一个下标后面所其他下标来定位元素(定位时需要跳过多少个元素)void printArray(int a[][3])
 
多维数组的数组名为第一维中第一个元素(可能又是一个多维数组)的地址。

extern

如果程序包含在多个源文件中,而某个外部(全局)变量在file1文件中定义、在file2和file3文件中使用,那么在文件file2与file3中就需要使用extern声明来建立该变量与其定义之间的联系。

“定义”与“声明”

“定义”表示创建变量或分配存储空间,而“声明”指的是说明变量的性质,但不分配存储单元。
下面即是声明:int lower,upper,step;
 
声明用于说明每个标识符的含义,而并不需要为每个标识符预留存储空间,预留存储空间的声明称为定义。

变量命名规则

与Java一样 A$0
标准规定,标识符前至少31个字符有效,在某些实现中,有效字符可能会更多。

数据类型

char
int
float
double
short (int)
long (int)
float
double
long double
 
int通常代表特定机器中整数的自然长度。位,位,或位。各编译器可以根据硬件特殊自主选择合适的类型长度,但要遵循下列限制:位,而位,并且表示真,表示假
 
整型常量若以字母u或U为后缀,则表示它是一个无符号数;若以字母1或L为后缀,则表示它是一个长整型数;若以字母UL为后级,则表示它是一个无符号长整型数
 
整型常量的类型同它的形式、值和后辍有关。如果它没有后缀且是十进制表示,则其类型很可能是int,long int或unsigned long int;如果它没有后缀且是八进制或+六进制表示,则其类型很可能是int,unsigned int,long int,unsigned long int;如果它的后缓为u或U,则其类型很可能是unsigned int,ungigned long int;果它的后缓为l或L,则其类型很可能是unsigned int,ungigned long int
 
C中的整型常量默认都是int类型的常量,但如果一个整数太大以至于无法用int类型表示时,也将被当作long类型处理。
 
无符号常量以字母u或U结尾。后缀ul或UL表示是 unsigned long类型,通常用在八进制或十进制常量后面来标示最高位到底是符号位还是数字位,而开头,十六进制使用0X开头。
 
0XFF=255       char
0XFFFF=65535   short
0XFFFFFFFF=-1  int
如果十六进制常量位数不达到整型int所占位数时,常量首位被看作数字位,而非符号位,如果超过int,则按long来处理
 
unsigned short a=0xFFFF ,则a=65535,但如果去掉unsigned修饰符后,a=-1,这也从另一方面验证了“整型常量默认都是int类型的常量”
    unsignedshort a1 = 0xFFFF;
    short a2 = 0xFFFF;
    printf("%d \n", a1);//65535
    printf("%d \n", a2);//-1
    printf("%d \n", 0xFFFF);//65535
 
    unsignedshort a3 = -1;
    short a4 = -1;            
    printf("%d \n", a3);//65535
    printf("%d \n", a4);//-1
    printf("%d \n", -1u);//-1
 
在C中可以将大的数据类型赋给小的数据类型(比如将long赋值给short类型的变量),不像Java那样需要强转:否则非法。
 
 
当把较长的整数转换为较短的整数或char类型时,超出的高位部分将被丢弃。如将一个float类型赋值给一个int类型变量时,小数部分将被截取掉;但当把double类型赋值给float类型时,是进行四舍五入还是截取这取决于具体实现。

算术类型提升与转换规则

首先,如果任何一个操作数为 long double 类型,则另一个操作数转换为 long double 类型。
否则,如果任何一个操作数为 double 类型,则将另一个操作数转换为 double 类型。
否则,如果任何一个操作数为 float 类型,则将另一个操作数转换为 float 类型。
否则,如果任何一个操作数为 unsigned long int 类型,则将另一个操作数转换为 unsigned long int类型。
否则,如果一个操作数为 long int 类型且另一个操作数为 unsigned int 类型,则结果依赖于long int类型是否可以表示所有的unsigned int类型的值。如果可以,则将unsigned int类型的操作数转换为long int;否则将两个操作数都转换为usigned long int。
否则,如果一个操作数为long int类型,则将另一个操作数转换为long int类型。
否则,如果任何一个操作数为unsigned int类型,则将另一个操作数转换为unsigned int类型。
否则,将两个操作数都转换成int类型。
 
注,表达式中float类型的操作数不会自动转换成double类型(在没有double类型操作数的情况下,与int类型不同)
 
假定int类型占有16位,long类型占32位,那么,-1L>1UL,这是因为-1L将被提升为unsigned long类型,因而成为一个比较大正数。

void

void对象的(不存在的)值不能够以任何方式使用,也不能被显式或隐式地转换为任一非空类型。因为空(void)表达式表示一个不存在的值,这样的表达式只可以用在不需要值的地方
可以通过强制类型转换将表达式转换为void类型。

\000、\xhh

\000最大字符可表示为 \377,第一位不能大于3(在有三位的情况下),因为一旦大于,则表示的总位数会大于8位。注,也可只使用2位8进制位来表示,则此时第一位就可以使用大于3的数表示了,另外也可只有一位,比如空字符 \0。
\378此时表示两个字符 \37 与 8
\xhh一样,最多两位,也可以只有一位十六进制。

ANSI C中所有转义字符

\a   响铃
\b   回退
\f    换页
\n   换行
\r    回车
\t    横向制表
\v   纵向制表
\\
\\?
\’
\”
\000
\xhh

\0

字符常量 ‘\0’ 表示值为0的字符,也就是空字符(null),但我们通常用 ‘\0’ 的形式代替 0 ,以强调某些表达式的字符属性,但其数字值为0

[C程序设计语言]第一部分的更多相关文章

  1. c程序设计语言第一章3

    字符数组是C语言中最常用的数组类型.下面我们通过编写一个程序,来说明字符数组以反操作字符数组的函数的用法.该程序读入一组文本行,并把最长的文水行打印出来.该算法的基本框架非常简单: while (还有 ...

  2. c程序设计语言第一章1

    1,c程序都是由函数和变量组成的. 练习1.6验证布尔表达式getchar()!= EOF的取值是0还是1 答: #include <stdio.h> #include <stdli ...

  3. c程序设计语言第一章5

    练习1.20请编写程序d e t a b

  4. c程序设计语言第一章4

    (昨天网络出现了问题,导致这篇没来得及上传,再次补上,今晚照常上传笔记) 练习1.19编写函数r e v e r s e ( s )将字符串s中的字符顺序颠倒过来.使用该函数编写一个程序,每次颠倒一个 ...

  5. c程序设计语言第一章2

    练习1.13编写一个程序,打印输入中单词长度的直方图.水平方向的直方图比较容易绘制,垂直方向的直方图则要困难些 #include <stdio.h> #include <stdlib ...

  6. C程序设计语言(第二版)习题:第一章

    第一章虽然感觉不像是个习题.但是我还是认真去做,去想,仅此而已! 练习 1-1 Run the "hello, world" program on your system. Exp ...

  7. C程序设计语言笔记-第一章

     The C Programming language notes 一 基础变量类型.运算符和判断循环         char                 字符型  character      ...

  8. python程序设计语言笔记 第一部分 程序设计基础

    1.1.1中央处理器(CPU) cpu是计算机的大脑,它从内存中获取指令然后执行这些指令,CPU通常由控制单元和逻辑单元组成. 控制单元用来控制和协调除cpu之外的其他组件的动作. 算数单元用来完成数 ...

  9. c语言第一章第一节 认识变量

    声明:本人大一新生,闲着无聊..写写c语言教程..菜鸟一枚..大神勿喷!!! 接下来我们都用dev来进行编译..vc++太古老了,没提示功能,不好上手,并且老是出毛病..vs太大了,编个c不至于,运行 ...

随机推荐

  1. 搭建HTTP Live Streaming直播系统

    最近,需要将苹果的HTTP Live Streaming系统搭建起来.完全没有头绪,故第一步就是学习. 一.学习资料 官网资料 1. http://developer.apple.com/resour ...

  2. 求两个数的最大公约数(Java)

    获得两个随机数(100以内),并放入数组中 public int[] getTwoRandom(){ int[] t = new int[2]; Random rand = new Random(); ...

  3. win7中sql2005 连接其它sql2005服务器,连不上

    1.在管理工具-->高级安全 Windows 防火墙下配置下入站规则,将sql的端口加入里面,关闭防火墙并没有把这个给关闭掉 2 .Sql Server Browser 启用3.客户端协议 tc ...

  4. matlab mat文件读取和调用

    13.1 数据基本操作 本节介绍基本的数据操作,包括工作区的保存.导入和文件打开.13.1.1 文件的存储 MATLAB支持工作区的保存.用户可以将工作区或工作区中的变量以文件的形式保存,以备在需要时 ...

  5. c#多播委托

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...

  6. java关于StringBuffer和StringBuilder写入文件的效率问题

    StringBuffer在存储字符的时候,是有上限的,一旦达到上线就会出错,自己在项目中遇到一个从数据库中查询数据,然后写入到本地文件中 ,数据量大概有30万条,此时的效率十分的低.下面是大致的模拟该 ...

  7. 周赛-Toy Cars 分类: 比赛 2015-08-08 15:41 5人阅读 评论(0) 收藏

    Toy Cars time limit per test 1 second memory limit per test 256 megabytes input standard input outpu ...

  8. oracle驱动地址

    D:\app\LHComputer\product\12.1.0\dbhome_1\ODP.NET\bin\2.x

  9. 知乎上有一个问题“在mfc框架中,有上面方法能直接将opencv2.0库中的Mat格式图片传递到Picture Control”中显示?

    一直以来,我使用的方法都是shiqiyu在opencvchina上面提供的引入directshow,并且采用cvvimage和cameraDs的方法.这个方法虽然在xp/win7/win8下面都能够成 ...

  10. Linq中疏漏的几个知识点

    1.Union - 连接不同集合,自动过滤相同项 2.Concat - 连接不同集合,不会自动过滤相同项 3.Select - 类似List的ConvertAll,转换集合成员 4.Enumerabl ...