语法基础
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;
}
|