目录
一、C语言是什么
二、基础语法
2.1 第一个C语言程序
2.2 注释
2.3 数据类型
数据类型介绍:
变量:
变量的语法:
使用特点:
命名规则和规范:
命令规范:
char类型:
Boolean类型:
数据类型长度(大小):
可移植的类型:
常量:
2.4 数值表示
C语言如何表示相应进制数:
数值存储方式:
2.5 输入输出
输出:
输入:
2.6 运算符
算术运算符:
赋值运算符:
比较运算符:
逻辑运算符:
一、C语言是什么
C语言是计算机编程语言的一种,编程语言用于人和机器交流。
编程语言通过一系列的语法和语义规则来描述计算机程序的行为和逻辑,程序员使用编程语言编写程序后,计算机可以将程序转化为二进制指令(即机器码),并由CPU执行,CPU会按照指令的顺序依次执行每个指令。
二、基础语法
2.1 第一个C语言程序
#include <stdio.h>
int main() {
printf("hello world\n");
return 0;
}
- include头文件包含
#include <stdio.h>
这行代码是预处理指令,它告诉编译器包含标准输入输出头文件(stdio.h
)。这个头文件包含了用于输入/输出功能(如printf
和scanf
)的函数和宏定义。
- main函数
int main()
这是main
函数的开始。在C语言中,程序的执行从main
函数开始。main
函数返回一个整数值(通常是int
类型),这里返回的是0
,表示程序正常退出。
- printf函数
printf("hello world\n");
这行代码调用printf
函数,该函数用于格式化输出。在这里,它输出字符串“hello world”和一个换行符\n
。这意味着在输出“hello world”之后,光标会移动到下一行。
- return语句
return 0;
这行代码表示main
函数执行完毕,并返回整数值0
。在大多数操作系统中,返回0
表示程序成功执行,而非零值通常表示某种错误或异常情况。
2.2 注释
- 注释
- 对代码的解释和说明
- 特点
- 不会被执行
- 目的
- 让人们能够更加轻松地看懂代码
- 分类
-
- 行注释 //
- 快键键 ctrl+/
- 行注释 //
-
- 块注释 /**/
- 快键键 shift+alt+a
- 块注释 /**/
#include <stdio.h>
int main() {
// 行注释
/*
块注释
*/
printf("hello world\n");
return 0;
}
2.3 数据类型
数据类型介绍:
- 数据类型:c语言中数据类型有3种,分别是基本数据类型、构造数据类型、指针数据类型。
变量:
变量的语法:
- 在计算机程序中,变量是用来存储数据的一个内存区域,并用一个名字来表示这个区域。
使用特点:
- 变量在使用前必须先定义,定义变量前必须有相应的数据类型
- 在程序运行过程中,其值可以改变
#include <stdio.h>
int main() {
// 1. 定义1个int变量age同时赋值为18(这叫初始化),然后打印内容
int age = 18;
printf("%d\n", age);
// 2. 修改age的内容为20,然后打印内容
age = 20;
printf("%d\n", age);
// 3. 定义2个int变量,然后在分别赋值,然后再打印内容
int a, b;
a = 123;
b = 256;
printf("%d\n", a);
printf("%d\n", b);
// 4. 定义1个float类型变量height同时赋值,然后打印内容
float height = 1.77;
printf("%f\n", height);
return 0;
}
命名规则和规范:
- 规则说明:
- 只能由数字、字母、下划线_组成;
- 不能使用数字开头;
- 不能使用关键字;
-
- 变量名之间大小写是区分的;
- 只能由数字、字母、下划线_组成;
命令规范:
可以不遵循,只是一个建议,建议见名知意
-
风格:
-
大驼峰
-
每个单词首字母大写, 例如: MyFirstName
-
-
小驼峰
-
第二个单词开始首字母大写, 例如: myFirstName
-
-
下划线命名
-
每个单词之间使用下划线连接, 例如: my_first_name
-
-
char类型:
-
char的本质就是一个1字节大小的整型,一个字符对应一个ASCII 编码数字
#include <stdio.h>
int main() {
// 定义一个char类型变量,同时赋值为97,分别用%d,%c打印结果
char ch = 97;
printf("%d\n", ch);
printf("%c\n", ch);
// 定义一个char类型变量,同时赋值为'a',分别用%d,%c打印结果
char ch2 = 'a';
printf("%d\n", ch2);
printf("%c\n", ch2);
return 0;
}
Boolean类型:
-
布尔类型是一种处理逻辑的类型,其有两个值,分别是真(true)或假(false),它在内存中的长度一般只占用1个字节。
-
早期C语言没有布尔类型数据,以0代表逻辑假,非0代表逻辑真
-
C99标准定义了新的关键字_Bool,提供了布尔类型,或者也可以使用stdbool.h中的bool
#include <stdio.h>
#include <stdbool.h>
int main() {
// 定义一个bool类型变量,同时赋值为true,然后打印变量的值
bool flag = true;
printf("%d\n", flag);
// 修改上一步变量的值为false,然后打印变量的值
flag = false;
printf("%d\n", flag);
return 0;
}
数据类型长度(大小):
-
bit(比特)
-
一个二进制代表一位,一个位只能表示0或1两种状态。
-
-
Byte(字节)
-
一个字节为8个二进制,称为8位,计算机中存储的最小单位是字节。
-
-
使用sizeof查看数据长度 ○ 长度在不同平台是不一样。
#include <stdio.h>
int main() {
// 通过sizeof打印各种类型的长度(大小)
printf("char length = %d\n", sizeof(char));
printf("short length = %d\n", sizeof(short));
printf("int length = %d\n", sizeof(int));
printf("long length = %d\n", sizeof(long));
printf("float length = %d\n", sizeof(float));
printf("double length = %d\n", sizeof(double));
printf("long double length = %d\n", sizeof(long double));
// 定义int类型变量,sizeof打印变量的大小
int a;
printf("a length = %d\n", sizeof(a));
return 0;
}
可移植的类型:
- C语言在可移植类型头文件 stdint.h 和 inttype.h 中规定了精确宽度整数类型,以确保C语言的类型在各系统内功能相同。
- 作用:为了保障各个平台的数据类型相同。
#include <stdio.h>
#include <inttypes.h>
int main() {
// 8位整型
int8_t a=127;
printf("%d\n", sizeof(a));
// 16位整型
int16_t b = 127;
printf("%d\n", sizeof(b));
// unsigned 无符号,没有符号位,数值为正数
uint8_t c = 255;
uint16_t d = 200;
return 0;
}
nt8_t
的取值范围是:
- 最小值:
-2^(8-1)
=-2^7
=-128
- 最大值:
2^(8-1)-1
=2^7-1
=127
所以,
int8_t
的范围是-128
到127
。
int16_t
的取值范围是:
- 最小值:
-2^(16-1)
=-2^15
=-32768
- 最大值:
2^(16-1)-1
=2^15-1
=32767
所以,
int16_t
的取值范围是-32768
到32767
。uint8_t的取值范围:
- 最小值:
0
(所有位都是0)- 最大值:
255
(所有位都是1)所以,uint8_t的取值范围是
0
到255。
uint16_t的取值范围:
- 最小值:
0
(所有位都是0)- 最大值:
65535
(所有位都是1)所以,uint16_t的取值范围是
0
到65535。
因为uint8_t和uint_16是无符号的,所以它不能表示负数。
常量:
与变量不同,常量的值在程序运行时不会改变。
在赋值之后不能修改,否则报错。
定义常量的两种方式:
// 预处理常量
#define PI 3.14
// const常量
const double pi2 = 3.14;
示例:
#include <stdio.h>
// 预处理常量
#define PI 3.14
int main() {
// const常量
const double pi2 = 3.14;
// 常量不能修改,以下代码是错误的
PI = 3.33;
pi2 = 3.33;
return 0;
}
2.4 数值表示
C语言如何表示相应进制数:
十进制 | 以正常数字1-9开头,如15 |
八进制 | 以数字0开头,如017 |
十六进制 | 以0x或0X开头,如0xf |
二进制 | 以0b或0B开头,如0b1111 |
#include <stdio.h>
int main() {
// 十进制方式赋值
int a = 15;
// 八进制方式赋值
int b = 017;
// 十六进制方式赋值
int c = 0xf;
// 二进制方式赋值
int d = 0b1111;
printf("%d, %d, %d, %d\n", a, b, c, d);
return 0;
}
数值存储方式:
-
在计算机系统中,数值一律用补码来存储
-
对于正数,原码、反码、补码相同
-
对于负数,其补码为它的反码加1
-
负数的补码符号位不动,其他位求反,最后整个数加1,得到原码
-
原码
原码:一个数的原码就是它的二进制表示,其中最高位是符号位(0表示正,1表示负)。
十进制 | 原码 |
---|---|
5 | 0000 0101 |
10 | 0000 1010 |
0 | 0000 0000 |
-1 | 1000 0001 |
-5 | 1000 0101 |
反码
对于正数,反码与原码相同,对于负数,符号位不变,其它部分取反(1变0,0变1)。
十进制 | 原码 | 反码 |
---|---|---|
5 | 0000 0101 | 0000 0101 |
10 | 0000 1010 | 0000 1010 |
+0 | 0000 0000 | 0000 0000 |
-1 | 1000 0001 | 1111 1110 |
-5 | 1000 0101 | 1111 1010 |
补码(重点)
在计算机系统中,数值一律用补码存储。
十进制 | 原码 | 反码 | 补码 |
---|---|---|---|
5 | 0000 0101 | 0000 0101 | 0000 0101 |
10 | 0000 1010 | 0000 1010 | 0000 1010 |
+0 | 0000 0000 | 0000 0000 | 0000 0000 |
-1 | 1000 0001 | 1111 1110 | 1111 1111 |
-5 | 1000 0101 | 1111 1010 | 1111 1011 |
-
计算机的基石-补码
对于一个字节(8 位),他所能表示的范围有多大呢?所有可能编码如下,共 256种。
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
---|---|---|---|---|---|---|---|
1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 |
* | * | * | * | * | * | * | * |
* | * | * | * | * | * | * | * |
0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
-
补码的编码规则
如何来利用这些硬件的基础来表示我们需要的数据范围呢?就是编码。
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
-
补码的运算
-
正整数的补码是其二进制表示,与原码相同
-
求负整数的补码,将其对应正数二进制表示所有位取反(包括符号位,0 变 1,1变 0)后加 1。
-
-
转换关系
-
原码表示方法:最高位为符号位,1表示负数,0表示正数。其余比特位表示数值。
-
反码表示方法:正数的反码是其本身,负数的反码为在原码的基础上,符号位不变,其余位取反。
-
补码表示方法:正数的补码就是其本身,负数的补码为在原码的基础上,符号位不变,其余位取反,再+1(即在反码的基础上+1)
2.5 输入输出
输出:
- 输出:将程序的运行结果输出到控制台或终端窗口中
- printf语法格式
int printf (const char *format, ...);
-
- format参数是一个格式化字符串,包含了输出的格式控制信息
- 后面的参数
...
是可变参数,参数(要输出的数据)长度不固定
- 格式化占位符
打印格式 | 对应数据类型 | 含义 |
%c | char | 字符型,输入的数字按照ASCII码相应转换为对应的字符 |
%hd | short int | 短整数 |
%hu | unsigned short | 无符号短整数 |
%d | int | 接受整数值并将它表示为有符号的十进制整数 |
%u | unsigned int | 无符号10进制整数 |
%ld | long | 接受长整数值并将它表示为有符号的十进制整数 |
%f | float | 单精度浮点数 |
%lf | double | 双精度浮点数 |
%e,%E | double | 科学计数法表示的数,此处"e"的大小写代表在输出时用的"e"的大小写 |
%s | char * | 字符串。输出字符串中的字符直至字符串中的空字符(字符串以'\0‘结尾,这个'\0'即空字符) |
%p | void * | 以16进制形式输出指针 |
%o | unsigned int | 无符号8进制整数 |
%x,%X | unsigned int | 无符号16进制整数,x对应的是abcdef,X对应的是ABCDEF |
示例代码:
#include <stdio.h>
int main() {
// 定义变量
char c = 'A';
short s = 10;
int i = 10;
long l = 10;
float f = 1.123456789123456789;
double d = 1.123456789123456789;
unsigned int ui = 20;
char *name = "bill";
// 格式化输出
// 整型
printf("c=%d\n", c);
printf("s=%hd\n", s);
printf("i=%d\n", i);
printf("l=%ld\n", l);
// 浮点类型
printf("f=%.10f\n", f);
printf("d=%.20lf\n", d);
// 无符号数据
printf("u=%u\n", ui);
// 八进制和十六进制 可以加上前缀# 自动输出八进制和十六进制0或0x
printf("o=%#o\n", 120);
printf("x=%#x\n", 120);
// 字符串类型
printf("s=%s\n", name);
// 内存地址
printf("ps=%p\n", &s);
return 0;
}
输入:
- 输入:接收用户输入的数据的过程
- scanf语法格式
scanf("格式化字符串", &变量1, &变量2,...);
-
- 格式化字符串用于指定输入的数据类型及其格式
- 变量1、变量2等是要读入的变量的地址
示例代码:
#include <stdio.h>
int main() {
// 定义int类型变量age,通过scanf输入内容,然后打印内容
int age;
printf("请输入年龄:");
scanf("%d", &age);
printf("age = %d\n", age);
return 0;
}
2.6 运算符
算术运算符:
运算符 | 术语 | 示例 | 结果 |
+ | 加 | 10 + 5 | 15 |
- | 减 | 10 - 5 | 5 |
* | 乘 | 10 * 5 | 50 |
/ | 除 | 10 / 5 | 2 |
% | 取模(取余) | 10 % 3 | 1 |
++ | 前自增 | a=2; b=++a; | a=3; b=3; |
++ | 后自增 | a=2; b=a++; | a=3; b=2; |
-- | 前自减 | a=2; b=--a; | a=1; b=1; |
-- | 后自减 | a=2; b=a--; | a=1; b=2; |
赋值运算符:
运算符 | 术语 | 示例 | 结果 |
= | 赋值 | a=2; b=3; | a=2; b=3; |
+= | 加等于 | a=0; a+=2; 等同于 a = a + 2; | a=2; |
-= | 减等于 | a=5; a-=3; 等同于 a = a - 3; | a=2; |
*= | 乘等于 | a=2; a*=2; 等同于 a = a * 2; | a=4; |
/= | 除等于 | a=4; a/=2; 等同于 a = a / 2; | a=2; |
%= | 模等于 | a=3; a%=2; 等同于 a = a % 2; | a=1; |
比较运算符:
C 语言的比较运算中, “真”用数字“1”来表示, “假”用数字“0”来表示。
运算符 | 术语 | 示例 | 结果 |
== | 相等于 | 4 == 3 | 0 |
!= | 不等于 | 4 != 3 | 1 |
< | 小于 | 4 < 3 | 0 |
> | 大于 | 4 > 3 | 1 |
<= | 小于等于 | 4 <= 3 | 0 |
>= | 大于等于 | 4 >= 1 | 1 |
逻辑运算符:
运算符 | 术语 | 示例 | 结果 |
! | 非 | !a | 如果a为假,则!a为真; 如果a为真,则!a为假。 |
&& | 与 | a && b | 如果a和b都为真,则结果为真,否则为假。 |
|| | 或 | a || b | 如果a和b有一个为真,则结果为真,二者都为假时,结果为假。 |