C程序是一个字符序列,字符序列先被分解为称之为记号(token)的词法元素,再根据语法规则检查这些记号组合是否合法。
C语言是一门大小写敏感的,抢类型的语言,随便写一个数它都是有类型固定的。
词法元素(记号)分析举例:
例2.1 sum=x+y
分解成sum、=、x、+和y 共5个记号。
例2.2 int a,b=10 ;
分解成int、a、,、b、=、10和 ; 共7个记号
例2.3 x+++++y
分解成x、++、++、+、y 共5个记号
(一个数值是不可以自增的!)
语法图是另一种表示文法的常见方式,对应于每个非终结符有一个子图,图中每条路径对应于该非终结符的一个生成式,路径上的是生成式右端的终结符和非终结符。终结符用弧形框表示,非终结符用矩形框表示。
通俗的说,椭圆形:定义的关键字,方括号:我们编写的
分隔符统称为空白字符(包括空格符、制表符、换行符、换页符及注释符),在语法上仅起分隔单词的作用。
当程序中两个相邻的单词之间如果不用分隔符就不能区分开时则必须加分隔符(通常用空格符)。
例如,int x,y;不能写成 intx,y;
能写成 int x , y ;
char的存储长度是一字节 。
多数系统中char与signed char同(-128~127). unsigned char (0~255).
字符数据以ASCII码存储在内存中 。
在不要求大整数的情况下,可用字符型代替整型 。
int型值存储在一个机器字中 .
int(负2的31次方~2的31次方-1),2B指2个字节长,B = bye(字节)
假设字长为2B,int取值范围为-32768~32767,unsigned取值范围为0 ~ 65535
指数区称为阶码;
阶码的+-分别用来表示正数与小数。
尾数所占的位数决定值的精度,指数所占的位数决定值的范围。
float占4字节,其中符号1b,指数8b,尾数23b,其精度大约为7位,范围约10-38~10+38。
double占8字节,其中符号1b,指数11b,尾数52b,其精度大约为15位,范围约为10-308~10+308。
很多编译器将long double处理为double,在某些系统中,它占用10或12B。很少被使用。
浮点数的表示可能只是近似的。其值与表示法之间的差称为“可表示误差”。
计算也可能造成可表示误差。不能使用==和!=运算符比较浮点数据。
可以用两个数值之差同一个预定的小正数epsilon比较的方法解决这个问题。
如: x==0 可以用 abs(x-0)<0.000001表示 下溢时,有些系统指数域全为0,尾数域非0,有些系统简单地用0表示。
上溢后,用称为“无穷大”的特殊位模式表示,即指数域全为1,尾数域0。有些系统中将输出+Infinity或-Infinity。
整型常量
有三种表示方法(通过前缀字符区分):
十进制:无前缀
八进制:前缀为0
十六进制:前缀为0x或0X时。
例如,31可写成037,也可写成0x1f或0X1F
整型常量可以带有后缀,用以指定其类型:
字母u或U表示unsigned
字母l或L表示long
字母ul或UL
表示unsigned long
字母ll或LL表示long long (C99)
字母ull或ULL表示unsigned long long (C99)
无后缀时,表示int
当常量值超出指定类型的范围时,其实际类型取决于数值大小、前缀等,确定类型的规则很复杂,在标准化前的C语言、C89和C99中各不相同
转义序列
有些以\开头的特殊字符称为转义序列
转义序列有两种形式,一种是“字符转义序列”,即反斜线后面跟一个图形符号,用于表示字符集中的非图形符号和一些特殊的图形字符。
\n 换行 \t 水平制表符
\\ 反斜杠 \‘ 单引号
\“ 双引号 \0 空字符
\? 问号
\t 打印八个字节,用于对齐和补齐。
100%打印时应该再加一个%为100%%
写成用一对双引号括住0至多个字符的形式。
"string\n" /* 包含7个字符的字符串 */
"" /* 包含0个字符的空字符串*/
字符串中的单引号可以用图形符号表示,但双引号和反斜线必须用转义序列表示。例如:
"3'40\"" /* 表示5个字符的字符串:3'40" */
“c:\tc” /* 表示4个字符的字符串 */
“c:\\tc” /* 表示5个字符的字符串 */
如何将一个较长的字符串写成多行?有两种方法:
(1)行连接:在前一行的末尾输入续行符(\) 再换行。
"Hello,\
how are you " /* 换行后应紧靠行首 */
(2)字符串连接:将字符串分段,分段后的每个字符串用双引号括起来。
"Hello, "
"how are you" /* 换行后不必紧靠行首*/
‘a’与 “a”有何区别 ?
‘a’ : 字符常量,占1 B内存空间
“a” : 字符串常量,占2B内存空间
“a”存储时,系统自动在后面补上\0( 空字符,ASC11值为0,作为字符串结束标志)
字符串的存储长度比字符串的实际长度大1
“a”2个字符
“a\n”3个字符
字符串长度比实际长度小于1
strlen查看字符串长度
用一个标识符表示一个常量.
C语言中有三种定义符号常量的方法:
(1) 用#define指令(预处理指令,宏命令)
(2) 用const声明语句
(3) 用枚举类型
const是关键字,称为类型限定符。格式为:
const 类型名 标识符=常量;
例如:
const double PI=3.14159;
const int DOWN=0x5000;/* 下光标键的扫描码 */
const int YES=1,NO=0;
const声明的标识符是一个只读变量,编译时系统会根据定义的类型为该标识符分配存储单元,并把对应的常量值放入其中,该值不能再被更改,此后,程序中每次出现该标识符都是对所代表存储单元的访问。
#define定义的标识符没有对应的存储单元,只是在编译之前由预处理程序进行简单的文本替换。
变量代表内存中具有特定属性的一个存储单元,它用来存放数据,这就是变量的值,在程序运行期间,这些值是可以改变的。
要求对所有用到的变量作定义,也就是“先定义,后使用” 。
形式: 类型名 变量表;
如: int total,average;
变量在声明时可以同时赋一个初值(称为变量的显示初始化),每个变量必须分别显示初始化。
如:int count=0,sum=0;
char alert=‘\a’, c ;
int count=0,sum=0;(不能 int count=sum=0;)