Skip to content

C 语言笔记

前置知识

计算机程序设计语言主要分为:机器语言,汇编语言,高级语言

一个完整的 c 语言程序由一个 main() (主函数) 和若干个其他函数组合而成的,main() 有且仅有一个

函数是 c 语言程序的基本单位,程序从 main() 开始执行

所有语句以分号结束,一行可以写多个语句,一句也可以写在多行
// c 不看 \n , 只看 ;

c 语言的扩展名一般为 .c , 目标程序的扩展名通常为 .obj , 可执行程序的扩展名通常为 .exe
// .cpp 通常为 c++ 的源代码

c
// 这是单行注释
/*
这是
多行
注释
*/

# 开始的是编译预处理命令,结束不用加 ;(其不是 c 语言语句)
stdio.h // 标准输入/输出头文件

用户不能将 c 语言关键字用于自定义的标识符 (例如变量名)

A 的 ascii 码值是 65 , a 的 ascii 码值是 97 , 两者相差 32

plaintext
Dec  Hex  Char  |  Dec  Hex  Char  |  Dec  Hex  Char  |  Dec  Hex  Char
  0  00   NUL   |   32  20   SP    |   64  40   @     |   96  60   `
  1  01   SOH   |   33  21   !     |   65  41   A     |   97  61   a
  2  02   STX   |   34  22   "     |   66  42   B     |   98  62   b
  3  03   ETX   |   35  23   #     |   67  43   C     |   99  63   c
  4  04   EOT   |   36  24   $     |   68  44   D     |  100  64   d
  5  05   ENQ   |   37  25   %     |   69  45   E     |  101  65   e
  6  06   ACK   |   38  26   &     |   70  46   F     |  102  66   f
  7  07   BEL   |   39  27   '     |   71  47   G     |  103  67   g
  8  08   BS    |   40  28   (     |   72  48   H     |  104  68   h
  9  09   TAB   |   41  29   )     |   73  49   I     |  105  69   i
 10  0A   LF    |   42  2A   *     |   74  4A   J     |  106  6A   j
 11  0B   VT    |   43  2B   +     |   75  4B   K     |  107  6B   k
 12  0C   FF    |   44  2C   ,     |   76  4C   L     |  108  6C   l
 13  0D   CR    |   45  2D   -     |   77  4D   M     |  109  6D   m
 14  0E   SO    |   46  2E   .     |   78  4E   N     |  110  6E   n
 15  0F   SI    |   47  2F   /     |   79  4F   O     |  111  6F   o
 16  10   DLE   |   48  30   0     |   80  50   P     |  112  70   p
 17  11   DC1   |   49  31   1     |   81  51   Q     |  113  71   q
 18  12   DC2   |   50  32   2     |   82  52   R     |  114  72   r
 19  13   DC3   |   51  33   3     |   83  53   S     |  115  73   s
 20  14   DC4   |   52  34   4     |   84  54   T     |  116  74   t
 21  15   NAK   |   53  35   5     |   85  55   U     |  117  75   u
 22  16   SYN   |   54  36   6     |   86  56   V     |  118  76   v
 23  17   ETB   |   55  37   7     |   87  57   W     |  119  77   w
 24  18   CAN   |   56  38   8     |   88  58   X     |  120  78   x
 25  19   EM    |   57  39   9     |   89  59   Y     |  121  79   y
 26  1A   SUB   |   58  3A   :     |   90  5A   Z     |  122  7A   z
 27  1B   ESC   |   59  3B   ;     |   91  5B   [     |  123  7B   {
 28  1C   FS    |   60  3C   <     |   92  5C   \     |  124  7C   |
 29  1D   GS    |   61  3D   =     |   93  5D   ]     |  125  7D   }
 30  1E   RS    |   62  3E   >     |   94  5E   ^     |  126  7E   ~
 31  1F   US    |   63  3F   ?     |   95  5F   _     |  127  7F   DEL

非零即为真

C

变量

命名要求:^[a-zA-Z_][a-zA-Z0-9_]*$ (由字母,数字,下划线组成,第一位不可为数字,大小写敏感)

变量必须 先定义,后使用

同时定义多个变量时,变量名使用 , 隔开

c
// For example:
int a, b, c;

数据类型

  • 整型
    • 基本:int
    • 无符号:unsigned int
    • 短:short int
    • 无符号短:unsigned short
    • 长:long int
    • 无符号长:unsigned long
  • 浮点 (具有小数点的实数)
    • 单精度:float
    • 双精度:double
  • 字符:char

  • 字符 'a' [a]
  • 字符串 "a" -> [a,\0], \0 为结束符

运算符

一个操作数的:单目; 两个操作数的:双目; 运算优先级: () > 单目 (运算符) > * , / , % > + , -

  • 算数运算符
    • + 正号 (单目)
    • - 负号 (单目)
    • * 乘法
    • / 除法
    • % 求余 (取模)
    • + 加法
    • - 减法
  • 自增/自减 (单目)
    • 后置
      • i++
      • i--
    • 前置
      • ++i
      • --i
  • 复合赋值运算符
    • x += y 相当于 x = x + y
    • x -= y 相当于 x = x - y
    • x *= y 相当于 x = x * y
    • x /= y 相当于 x = x / y
    • x %= y 相当于 x = x % y
    • y *= y + z (后方为表达式) 相当于 y = y * (y + z)
  • 关系运算符
    • == 等于

逗号运算符

将多个表达式连接起来

c
a=1,b=2,c=a*b

整个表达式的值为最后一个表达式的值 其优先级最低 其具有左结合性

声明变量时 , 为分隔符

问号运算符

c 中唯一的三目运算符

c
<表达式>?<if true>:<if false>

假设 i = 5

  • a = i++ -> a 得到 5, 然后 i 变成 6.
  • b = ++i -> i 先变成 6, 然后 b 得到 6.

赋值

由赋值运算符将一个变量和一个表达式连接起来的式子被称为 赋值表达式

c
<变量> = <表达式>

将右侧表达式的值赋值给左边的变量

赋值运算符具有右结合性,即由右向左运算,x=(y=114) == x=y=114

表达式可以嵌套

两个整数相除为整数,舍去小数,如果一个数为负数,截断小数向零取整

当赋值运算符两边的操作数类型不一样时,将进行自动的类型转换,规则:把赋值运算符右侧表达式的类型转换成左侧变量的类型

float / double 的数据赋给整型时,通常舍弃 float / double 的小数部分

int 的数据赋给 float / double 类型的变量时,值不变,但以 float / double 型存储

两个不同类型的操作数进行计算时,按照 char, int, float, double 的顺序从左到右将左侧操作数的数据类型转换成右侧操作数的类型再进行计算

float 必须转换成 doublechar, short 必须转换成 int

两个不同类型的操作数进行计算时

  1. 进行整型提升:所有 narrower integer 类型(char、signed/unsigned char、short、_Bool)在表达式中先被提升到 int 或 unsigned int
  2. 应用常见算术转换决定共同类型:如果任一操作数为 double → 两者都转换为 double;否则若任一为 float → 两者都转换为 float;否则为整数类型,按宽度和有无符号性决定(可能转换为 unsigned long 等)

格式字符

  • d 10 进制整数
  • o 8 进制整数,不输出前导符 0
  • x 16 进制整数,不输出前导符 0x
  • u 10 进制无符号整数
  • c 字符,只输出一个字符
  • s 字符串
  • f 小数,隐含输出 6 位小数

函数附加格式说明字符说明
printf(), scanf()l标识长整形,用于 d, o, x, u 等表示整型的格式字符前,例如 %ld

转义字符

  • \n 换行
  • \t 跳到下个输入区 (tab)
  • \r 回车
  • \0 结束符
  • \\ \
  • \' '
  • \114 8 进制
  • \x114 16 进制

宏命令

常量

常量在运行过程中不可变,名称习惯上为大写

c
// For example:
#define NAME 1145

分类

  • 整型
    • 10 进制 ( 1 )
    • 8 进制 ( 01 )
    • 16 进制 ( 0x1 )
  • 实型 (浮点型)
  • 字符型
  • 字符串型

函数

  • getchar() 从标准输入获取内容