1一站式C语法深究

#名称: Linux编程  第1课
#参考资料: 亚嵌一站式C编程
#作者 一路向北
#时间 2013-8-19 9:16
#版本 RetHat 4.1.2-48
#内核版本 2.6.18-194.
#说明: 语法课之常量、变量和表达式 可以学习C语言中重要的单词便于后面英文版的阅读


1、注释不能嵌套(Nest)
2、C语言的发展历史三阶段:
Old Style C、C89、C99
C标准的目的是为了精确定义C语言,而不是为了教别人怎么编程,C标准在表达上追求准确和无
歧义,却十分不容易看懂,[Standard C]和[Standard C Library]是对C89及其修订版本的阐释
(可惜作者没有随C99更新这两本书),比C标准更容易看懂,另外,参考[C99 Rationale]也有
助于加深对C标准的理解。


双引号(Double Quote)
字符串字面值:(String Literal)即字符串
双引号是字符串的界定符
转义序列(Escape Sequence)
换行符 Line Feed
C标准中规定的转义字符:
\' 单引号'(Single Quote或Apostrophe) 
\" 双引号" 
\? 问号?(Question Mark) 
\\ 反斜线\(Backslash) 
\a 响铃(Alert或Bell) 
\b 退格(Backspace) 
\f 分页符(Form Feed) 
\n 换行(Line Feed) 
\r 回车(Carriage Return) 
\t 水平制表符(Horizontal Tab) 
\v 垂直制表符(Vertical Tab) 
注意点:
1、字符串中如果要便是单引号和问号,既可以使用转义序列\'和\?也可以直接使用字符'和?
例如:printf("nishi?'jiayou'");
但是如果要表示\和”就必须使用转义序列,因为\字符表示转义而不表示它的字面含义。
转义序列有两个作用:
A把普通字符转义成特殊字符,例如把字母n转义成换行符
B把特殊字符转义成普通字符,例如\和“是特殊字符,转义后取它的字面值


几个控制字符,不能用键盘直接输入,就采用\加字母的转义序列表示
\a 响铃字符
\b 和按下退格键的效果相同
\f 是分页符,主要用于控制打印机在打印源代码时提前分页,避免一个函数跨两页打印
\n\r 分别表示Line Feed(跳到下一行) 和Carriage Return(回到本行开头)
Windows 文本文件\r\n做分隔符
HTTP 用\r\n做行分隔符
Linux和Unix 文本文件用\n做行分隔符
\t 效果同Tab键
\v 用于在终端下定位表格的下一行


#include 必须独占一行




2、常量(Constant)
字符(Character)常量、整数常量(Integer)、浮点数(Floating Point)常量 枚举常量
字符常量用‘括起来,但是不能够像双引号一样扩一串字符串
例如’{‘
字符常量也可以是转义字符’\n‘
注意点:如果在字符常量中要表示双引号和问号,既可以使用转义序列\"和\?也可以直接用字符“和?
而要表示'和\则必须使用转义序列
计算机中整数和小数的内部表示方式不同,所以在C语言中是两种不同的类型(Type)
例如:34和3.14
小数在计算机术语中成为浮点数
printf("character:%c\ninteger:%d\nfloating point:%f\n");
printf中的第一个字符串成为格式化字符串(Format String),作用:
规定了后面几个常量是以何种格式插入到这个字符串中的。
格式化字符串中%号(Percent Sign)的c、d、f分别表示字符型、整型和浮点型的转换说说明(Conversion Specification)
占位符(Placeholder)
转义说明和转义序列有区别:
转义序列是编译时处理的,而转换说明是在运行时调用printf函数处理的
总结前面介绍的转义序列的规律,想想在printf的格式化字符串中怎么表示一个%字符?写个小程序试验一下。??


3、变量
变量是计算机存储器中的一块命名的空间
变量有不同的类型,变量的类型据顶了它所占的存储空间的大小


理解声明和定义
C中的声明(Declaration)有变量声明函数声明和类型声明
如果一个变量或者函数的声明要求编译器为它分配存储空间那么也可以成为定义(Definition)
因此定义是声明的一种


浮点型分为三种: float 单精度浮点型
double 双精度浮点型
long double 精度更高的浮点型
double用%f
C语言规定变量命名必须是字母数字下划线,开头必须是以字母或者下划线_Underscore
标识符(Identifier):
函数名、宏定义、结构体成员名等
保留字或者关键字:
Keyword或者Reserved Word
C99的关键字
auto  break  case  char  const  continue  default  do  double
else  enum  extern  float  for  goto  if  inline  int  long
register  restrict  return  short  signed  sizeof  static  struct  switch  typedef
union  unsigned  void  volatile  while  _Bool  _Complex  _Imaginary
一般来说应避免使用以下划线开头的标识符,因为编译器将这类命名用作扩展功能,如果你看
库函数就知道为什么了


请记住:理解一个概念不是把定义背下来就行了,一定要理解它的外延和内涵,也就是什么情
况属于这个概念,什么情况不属于这个概念,什么情况虽然属于这个概念但一般推荐的做法
(Best Practice)是要尽量避免这种情况,这才算是真正理解了


4、赋值(Assignment)
所谓赋值就是把值存到它们所表示的存储空间里。
声明后的变量名代表一块存储空间
变量声明中的类型表明这个变量代表有多大的一块存储空间
小小总结一下:
变量的最小存储单位是字节Byte
定义一个变量就是分配一块存储空间并给他命名
给一个变量赋值,就是把一个值保存到这块存储空间中
变量的定义和赋值也可以一步完成,称为变量的初始化(Initialization)
注意:
初始化是一种特殊的声明,而不是一种赋值语句。
求解赋值和初始化的相同和不同点?


5、表达式(Expression)
运算符(Operator)
参与运算的常量和变量称为操作数(Operand)
优先级(Precedence)
括号(Parenthesis)
结合性(Associativity)

表达式所表示的存储位置称为左值lvalue(允许放在等号左边??那右边呢)
表达式的值称为(只能放在等号右边)
即有的表达式既可以做左值也可以做右值,而有的表达式只能做右值
做左值的表达式有变量和???
eg:
(a=b)=c是不合法的,先求a=b没有问题,但是(a=b)这个表达式不能再做左值了,因此放在等号左边是错误的

向下取证的运算称为Floor数学符号[],上面缺,
向下取证的运算称为Ceiling,数学符号[],下面缺
向下取整59/60 = 0
向上取整59/60 = 1
向xia取整-59/60 = -1
向上取整-59/60 = 0

C语言总整数除法取的既不是Floor也不是Ceiling,无论操作数是正是负总是把小数部分去掉
也就是说在数轴上向零的方向取整(Truncate toward Zero).或者说当操作数为正的时候相当于Floor,
当操作数为负的时候相当于Ceiling
思考题:
假设变量x和n是两个正整数,我们知道x/n这个表达式的结果要取Floor,例如x是17,n是4,则结果是4。如果希望结果取Ceiling应该怎么写表达式呢?例如x是17,n是4,则结果是5;x是16,n是4,则结果是4。
-(-17/4)???

------------------------------------------------------------
6、字符类型与字符编码
 符号在计算机内部也是用数字表示,每个字符在计算机内部用一个整数表示,称为字符编码(Character Encoding)
目前最常用的是ASCll码(American Standard Code for Information Interchange,美国信息交换标准码)

十进制Dec
十六进制Hx
八进制Oct
注意'0'~'9'的ASCII码是十六进制的30~39,和整数值0~9是不相等的。

字符也可以用ASCII码转义序列表示,这种转义序列由\加上1~3个八进制数字组成,或者由\x
或大写\X加上1~2个十六进制数字组成,可以用在字符常量或字符串字面值中。例如'\0'表示
NUL字符(Null Character),'\11'或'\x9'表示Tab字符,"\11"或"\x9"表示由Tab字符组成
的字符串。注意'0'的ASCII码是48,而'\0'的ASCII码是0,两者是不同的。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值