//C是区分大小写的语言

C 的令牌(Tokens)

C 程序由各种令牌组成,令牌可以是关键字、标识符、常量、字符串值,或者是一个符号。
例如printf ``( ``"Hello, World! \n" ``) ``;包含5个令牌

  1. printf
  2. (
  3. “Hello, World! \n”
  4. )
  5. ;

    分号

    分号是语句结束符。每个语句必须以分号结束

    空格

    只包含空格的行,被称为空白行,可能带有注释,C 编译器会完全忽略它。
    空格分隔语句的各个部分,让编译器能识别语句中的某个元素(比如 int)在哪里结束,下一个元素在哪里开始
    **int age**

    注释

    单行**//...** 多行**/* ... */**
    除了**/* /* */ */**其他都是可以的,如**// /**/ ** ** /* // */**
  • 如果只有/没有 / ,则/*后全都被注释

出现在字符串中就直接输出了

C 标识符是用来标识变量、函数,或任何其他用户自定义项目的名称。

  • 不能以数字作为开头
  • 只能存在字母,下划线和数字

    关键字

    下表列出了 C 中的保留字。这些保留字不能作为常量名、变量名或其他标识符名称。
auto else long switch
break enum register typedef
case extern return union
char float short unsigned
const for signed void
continue goto sizeof volatile
default if static while
do int struct _Packed
double

变量

变量是程序可操作的存储区的名称,C 中每个变量都有特定的类型(void也是一种变量类型,但是不可以定义变量为void,表示类型的缺失。如**void a;**是错的)定义变量必须是有效的数据类型,void不是有效数据类型
声明定义初始化可以一次性创建多个变量int d = 3, f = 5; int d,f;
int d,f;是声明并定义变量int d=3;为声明定义同时初始化

初始化局部变量和全局变量

  • 当局部变量被定义时,系统不会对其初始化,此时输出的是随机的值(一般大概率是等于默认值的,有时候就是错误值) 所以您必须自行对其初始化。
  • 定义全局变量时,系统会自动对其初始化,如下所示:(电脑上实际即便是局部变量未初始化,也可以输出默认值。。。) | 数据类型 | 初始化默认值 | | —- | —- | | int | 0 | | char | ‘’ | | float | 0(电脑上是输出的0.000000) | | double | 0(电脑上是输出的0.000000) | | pointer | NULL |

声明与定义

int d;是声明并定义
extern int d;只有声明,定义还要编译器去找
函数也是一样void fun1();//函数声明 void fun1(){ //函数定义 cout<<"fun1"<<endl;}

  • 变量声明向编译器保证变量以给定的类型和名称存在,这样编译器在不需要知道变量完整细节的情况下也能继续进一步的编译。(因为c语言是一条一条语句运行的,所以需要使用变量声明提前告诉编译器以免报错)
  • 变量声明只在编译时有它的意义,在程序连接时编译器需要实际的变量声明。
  • 当您使用多个文件且只在其中一个文件中定义变量时(定义变量的文件在程序连接时是可用的),变量声明就显得非常有用

**extern**关键字可以在任何地方声明变量,一个变量可以被多次声明,但是只能被定义一次(一般用于写在实际声明定义语句前,在需要提前调用地方写)
变量声明:**extern 数据类型 变量名;**


函数声明:**返回值类型 函数名(参数列表);**
声明时参数列表可以不写变量名只写个数据类型,如**void getA(int a,double,double);**
只要参数类型和个数对的上就行,参数变量名称也可以不一样(java也一样)

左值与右值(表达式类型)

左值表达式:可以出现在赋值号左边也可以在右边
右值表达式:不可以对其进行赋值的表达式。即只能出现在赋值号右边

常量

常量可以是任何的基本数据类型,比如整数常量、浮点常量、字符常量,或字符串字面值,也有枚举常量。
常量就像是常规的变量,只不过常量的值在定义后不能进行修改。


  • 整数常量 前缀
    • 十六进制:0x或者0X前缀 (0~9,A(a)~F(f))
    • 八进制:0前缀 (0~7)
    • 十进制:不带前缀
  • 整数常量 后缀
    • U/u 后缀:无符号整数(unsigned)
    • L/l 后缀:长整数(long)

2个后缀可以一起用,顺序任意;前缀与后缀不可重复使用


  • 浮点常量
    • 小数形式:必须包含小数点或者指数,或同时包含两者
    • 指数形式:必须包含整数部或者小数部分,或同时包含两者

指数形式为aEb,即a乘以10的b次方幂 如100=1e2=100e0
**314159E-5=3.14159 即10的-5次方**

  • 注意命令行运行输出浮点数是输出小数点后6位,不足的补0 若超出则四舍五入

注意c语言输出比较结果必须用%d输出才能得到0、1。用%f输出只会得到0.000000 用%s则无任何输出
总之要输出什么类型就用对于的格式化输出(%?)

  1. 3.14159 /* 合法的 */
  2. 314159E-5L /* 合法的 */
  3. 510E /* 非法的:不完整的指数 */
  4. 210f /* 非法的:没有小数或指数 */
  5. .e55 /* 非法的:缺少整数或分数 */

  • 字符常量:使用单引号包含
    • 普通字符:’a’
    • 转义字符
    • 通用字符:如'\u02C0',表示€

转义字符:有一些特定的字符,当它们前面有反斜杠时,它们就具有特殊的含义

转义序列 含义
\\ \ 字符
\‘ ‘ 字符
\“ “ 字符
\? ? 字符
\a 警报铃声
\b 退格键
\f 换页符
\n 换行符
回车
\t 水平制表符
\v 垂直制表符
\ooo 一到三位的八进制数 \07=\7≠ \007 即0前缀可加可不加 输出为八进制对应的ascii
\xhh . . . 一个或多个数字的十六进制数
必须加x前缀表示(只能是小写)十六进制 十六进制数的字母可大写可小写
\0A=\00a=\00000a…
输出十六进制对应的ascii

  • 字符串常量
    • 字符串可以看成多个字符,字符在字符串中时不需要’’,多个字符只需要一个””即可如**"Hello\tWorld\n\n"**
    • 可以使用/进行换行编辑(即编辑器中使用\才能对字符串换行,但是输出没有变化)
    • 可以使用空格进行分隔
    • 双引号中包含双引号不会输出双引号,但是双引号包含单引号则会输出单引号 ```c “hello, dear”

“hello, \ dear”

“hello, “ “d” “ear” ``` 这三个结果是一样的。

定义常量

常量一般大写命名

  • 使用预处理器:如**#define PI=3.14**`` ``**不需要写数据类型**
  • 使用const关键字前缀:如** const float PI=3.14; 需要写数据类型**
    • const创建常量时必须初始化,而且声明和初始化必须一起完成

image.png

初始化与定义可以看成是一回事

ASCII

65(A)~90(Z) 97(a)~122(z) 英文字母有26个.