语法基础
Copyright
本页面贡献者:LyuLumos。
本页面内容遵循 MIT 协议,转载请附上原文出处链接和本声明。
 
理论知识
- C语言书写格式是自由的,每行可以写多个语句,可以写多行。  
- 一个C语言程序有且只有一个main函数,是程序运行的起点。  
- 每个C语言程序写完后,都是先编译,后链接,最后运行。(.c->.obj->.exe)这个过程中注意.c和.obj文件时无法运行的,只有.exe文件才可以运行。  
- C面向过程,C++、java面向对象。    
标识符
- 合法的要求是由字母、数字、下划线组成,并且第一个必须为字母或是下划线。  
- 关键字不可以作为用户标识符号。main  define  scanf  printf include If都不是关键字。
- 驼峰命名法
整数
| 数据类型 | 定义标识符 | 占字节数 | 数值范围 | 
| 短整型 | short | 2 | -215~215-1 (32767) | 
| 整型 | int | 4 | -231~231-1(约2×109) | 
| 超长整型 | long long | 8 | -263~263-1(约9×1018) | 
| 无符号整型 | unsigned int | 4 | 0~232-1(约4×109) | 
| 其余无符号类型同理 |  |  |  | 
实数
| 数据类型 | 定义标识符 | 数值范围 | 占字节数 | 有效位数 | 
| 单精度实型 | float | -3.4×1038~3.4×1038 | 4 | 6~7位 | 
| 双精度实型 | double | -1.7×10308~1.7×10308 | 8 | 15~16位 | 
| 布尔型 | bool | true或false | 1 |  | 
全整数除法
两个整数相除结果还是整数,5/2的值为2而不是2.5  
解决方法:至少一个数转换成浮点数,如5/2.0 (float)a/b
除以0会返回NaN
字符型
| 定义标识符 | 占字节数 | 数值范围 | 
| char | 1 | -128~127 | 
- 直接表示
char c = 'A';
- ASCII码表示
char ch = 65;
- 转义字符
换行符 '\n'
 单引号'\''
 反斜杠'\\'
- 字符型也可以做加减运算
运算符和表达式
| 运算符类型 | 常用运算符 | 示例 | 
| 算术运算符 | + - * / % ++ -- | 5 % 2 | 
| 关系运算符 | > < == >= <= != | a == 1 | 
| 逻辑运算符 | && || ! | a>0 && a<b | 
| 位操作运算符 | & | ~ ^ << >> | 1<<2 | 
| 赋值运算符 | = += &= <<= | a += 2 | 
| 条件运算符 | ? : | a == 1 ? 1 : 0 | 
| 指针运算符 | * & | *it | 
赋值语句
- 格式:
  变量 = 表达式;
- 意义:
  将右边表达式的值赋给左边的变量
- 一定要区分 =和 等于, C语言中判断相等用==运算符|  | if(a = 1) //×
while(a = 1) //×
 |  
 
- 在进行赋值运算时,如果赋值运算符两边的数据类型不同,系统将会自动进行类型转换,即将赋值运算符右边的数据类型转换成左边的变量类型。可能会出现数据丢失。
运算符优先级
自增表达式
|  | int a = 21;
int c ;
// a 的值在赋值之前不会自增
c = a++;   
// c = 21 a = 22
// a 的值在赋值之前自增
c = ++a;  
// c = 23 a = 23
 | 
位运算
| 运算符 | 名称 | 作用 | 
| & | 与 | 两个位都为1时,结果才为1 | 
| | | 或 | 两个位都为0时,结果才为0 | 
| ^ | 异或 | 两个位相同为0,相异为1 | 
| ~ | 取反 | 0变1,1变0 | 
| << | 左移 | 各二进位全部左移若干位,高位丢弃,低位补0 | 
| >> | 右移 | 各二进位全部右移若干位,对无符号数,高位补0,有符号数 | 
标准输入输出
- 头文件:<stdio.h>
- 输入函数:
 scanf("%对应格式字符", &变量名);
- 输出函数:     
 printf("其他字符 %对应格式字符 其他字符", 变量名);
- 一定不要忘记scanf函数中的&
- 字符类型变量名 = getchar();使用时注意吃掉换行符
| 数据类型 | 格式符* | 数据类型 | 格式符* | 
| int | %d | long long | %lld | 
| unsigned long long | %llu |  |  | 
| char | %c | 字符数组 | %s | 
| float | %f | double | %lf | 
*这里为了看着方便加上了%
|  | int a;
long long b;
char c;
double d = 1.0;
float f = 2.7;
scanf("%d%lld", &a, &b);
scanf("%c", &c); //空格,回车,缩进都会被读入,注意!
printf("%d%d", a, c); //c被转换成int类型
printf("ans = %f %.12lf\n", f, d);
 | 
Bug
|  | // 除了大括号,每行至少有一个bug
int mian()
{
    int a, b; c, d = 1;
    bool flag1 = ture, flag2 = flase;
    scanf("%d", a);
    printf("%d, b");
    c = b + 1
    e = 2ab;
    return 1;
}
 |