C语言常用知识总结
在 C 语言中,常量是一种固定值的标识符,它的值在程序执行期间不会改变。
C 语言中有几种不同类型的常量:
字符常量:用单引号括起来的单个字符,例如 'A'、'b'、'1' 等。
字符串常量:用双引号括起来的字符序列,例如 "Hello"、"goodbye" 等。
整型常量:十进制、八进制或十六进制表示的常量,例如 123、0377、0xFF 等。
浮点型常量:十进制形式的常量,例如 3.14、6.022e23 等。
常量名是大小写敏感的,通常使用大写字母表示常量。例如:
#define PI 3.14159 #define MAX_LEN 100
C语言的运算符可以分为以下几类:
- 算术运算符:包括加(+)、减(-)、乘(*)、除(/)和取模(%)等。
- 关系运算符:包括大于(>)、小于(<)、等于(==)、不等于(!=)、大于等于(>=)和小于等于(<=)等。
- 逻辑运算符:包括逻辑与(&&)、逻辑或(||)和逻辑非(!)等。
- 赋值运算符:包括赋值(=)、加等于(+=)、减等于(-=)、乘等于(*=)、除等于(/=)和取模等于(%=)等。
- 位运算符:包括按位与(&)、按位或(|)、按位异或(^)、按位左移(<<)、按位右移(>>)和按位取反(~)等。
- 其他运算符:包括条件运算符(?:)、大小比较运算符(sizeof)和逗号运算符(,)等。
C语言中的逻辑运算符包括逻辑与、逻辑或和逻辑非。
逻辑与(&&):当且仅当两边的表达式都为真时,整个表达式才为真。
逻辑或(||):当两边的表达式有一边为真时,整个表达式就为真。
逻辑非(!):将原来的布尔值取反。
if ((a < b && b < c) || (!(d > e) && c < b)) { // 当(a < b < c)或(!(d > e) && c < b)为真时执行 }
正数补码和负数补码
正数补码和负数补码是在计算机中用于表示整数的一种二进制表示方法。
在计算机中,正数补码和负数补码都使用补码的形式来表示整数。补码是由原码(即普通的二进制表示方法)转换而来的,它是在原码的基础上取反(即将每一位取反),然后再加 1。
例如,如果要将十进制数 5 转换为二进制补码,可以按照如下步骤进行:
将 5 转换为二进制,得到 101; 将 101 取反,得到 010; 将 010 加 1,得到 011,即 5 的二进制补码为 011。
对于负数补码,也是类似的,只不过要先将十进制负数转换为二进制原码,然后再转换为补码。
例如,如果要将十进制数 -5 转换为二进制补码,可以按照如下步骤进行:
将 -5 转换为二进制,得到 101; 将 101 取反,得到 010; 将 010 加 1,得到 011,即 -5 的二进制补码为 101。
标识符命名规则:
- 标识符由字母、数字、下划线组成,但必须以字母或下划线开头;
- 不能使用 C 语言的保留字(即关键字)作为标识符;
- 不能将大写字母和小写字母混合使用,但可以使用下划线;
- 不能以下划线结尾;
- 不能使用两个或以上的连续下划线;
- 不能使用多个下划线作为前缀或后缀。
示例:
• 合法标识符:my_var1、_a、b2、__a、a_b、a_b_c
• 不合法标识符:1a、1_a、a_、a__b、a__b__c、a_b
按位异或运算的运算规则如下:
0 ^ 0 = 0 0 ^ 1 = 1 1 ^ 0 = 1 1 ^ 1 = 0
例如,3 ^ 5 = 6,因为二进制表示中 3 的二进制位为 011,5 的二进制位为 101,按位异或后得到 110,即 6。
按位异或运算常用于对两个数进行比较,因为按位异或后相同的数位会得到 0,不同的数位会得到 1。例如,如果要比较两个数是否相同,可以使用按位异或运算,如果得到的结果为 0,则这两个数相同,否则不同。
按位取反运算的运算规则如下:
~0 = 1 ~1 = 0
例如,~3 = -4,因为二进制表示中 3 的二进制位为 011,按位取反后得到 100,即 -4。
按位取反运算常用于计算补码。例如,负数的补码是将它的二进制表示中的每一位取反,然后将结果加 1。
三目运算符
三目运算符是一种简化版的条件运算符。它可以用来代替 if-else 语句。
三目运算符的语法如下:
result = condition ? value1 : value2v
如果 condition 为 true,则 result 的值为 value1;否则,result 的值为 value2。
例如,下面的代码使用了三目运算符:
int x = 10, y = 20; int max = x > y ? x : y;
C 语言有几种基本的数据类型:
char
:字符型,占 1 个字节。int
:整型,占 4 个字节。float
:浮点型,占 4 个字节。double
:双精度浮点型,占 8 个字节。
还有一些附加的类型,包括 short
(短整型,占 2 个字节)、long
(长整型,占 8 个字节)和 long long
(长长整型,占 8 个字节)。
你可以在变量名之前使用关键字 signed
或 unsigned
来指定变量的符号,如 signed int
或 unsigned long
。默认情况下,整型变量是有符号的。
例如:
char ch = 'a'; int i = -100; float f = 3.14159; double d = 3.141592653589793; signed int si = -100; unsigned int ui = 100; short s = -200; long l = -10000; long long ll = -10000000000;
常量
在 C 语言中,常量是一种固定值的标识符,它的值在程序执行期间不会改变。
C 语言中有几种不同类型的常量:
- 字符常量:用单引号括起来的单个字符,例如 'A'、'b'、'1' 等。
- 字符串常量:用双引号括起来的字符序列,例如 "Hello"、"goodbye" 等。
- 整型常量:十进制、八进制或十六进制表示的常量,例如 123、0377、0xFF 等。
- 浮点型常量:十进制形式的常量,例如 3.14、6.022e23 等。
- 标识常量 宏
在 C 语言中,可以使用 #define
预处理指令来定义常量,这称为标识常量。标识常量是在编译期间由预处理器替换成实际值的一种常量。
常量名是大小写敏感的,通常使用大写字母表示常量。例如:
#define PI 3.14159 #define MAX_LEN 100
宏也是使用 #define
预处理指令定义的,它是一种特殊的函数,在编译期间由预处理器替换成代码的一种工具。
#define SQUARE(x) ((x) * (x)) int x = SQUARE(5); // x 的值为 25
标识常量和宏的主要区别在于,标识常量只是简单的替换,而宏会将整个表达式替换成代码。
例如:
#define SQUARE(x) x * x int x = SQUARE(5 + 1); // x 的值为 12,而不是 36
变量
在 C 语言中,变量是程序中用于存储和操作数据的地方。变量必须先声明,然后才能使用。
声明变量的语法格式如下:
<data type> <variable name>;
其中,<data type>
是变量的类型(例如 int
、float
等),<variable name>
是变量的名称。
例如:
int x; float f; char c;
变量的内容空间首地址,会变成变量的首地址
在 C 语言中,每个变量都有一个内存地址,即变量在内存中的位置。可以使用 &
运算符来获取变量的内存地址。
例如:
#include <stdio.h> int main() { int x = 10; printf("x 的内存地址是 %p\n", &x); return 0; }
输出结果:
x 的内存地址是 0x7fff5d72d97c
注意,变量的内存地址只是变量在内存中的位置,并不是变量的值。如果要获取变量的值,需要使用变量的名称。
例如:
int x = 10; int y = x; // y 的值为 10
变量的分类
C 语言中,变量可以分为几类:
- 全局变量:定义在函数外的变量,在整个程序的生命周期内都有效。全局变量的初始值为 0。
- 局部变量:定义在函数内的变量,仅在函数内部有效。局部变量的初始值不确定。
- 静态局部变量:定义在函数内的变量,使用
static
关键字修饰。静态局部变量只在函数第一次调用时初始化,之后每次调用函数时都会保留其上次的值。 - 参数:函数定义中声明的变量,用于接收函数调用时传入的参数。
例如:
#include <stdio.h> // 全局变量 int g_x = 10; void func() { // 局部变量 int y = 20; // 静态局部变量 static int z = 30; } int add(int x, int y) { // 参数 x 和 y return x + y; } int main() { // 全局变量 printf("g_x 的值是 %d\n", g_x); func(); // 函数调用,传入两个参数 int sum = add(10, 20); printf("sum 的值是 %d\n", sum); return 0; }
还有一些附加的变量类型:
- 自动变量:定义在函数内部的变量,使用
auto
关键字修饰。自动变量在函数执行结束后自动释放,它是 C 语言中默认的变量类型。 - 注册变量:定义在函数内部的变量,使用
register
关键字修饰。注册变量存储在 CPU 的寄存器中,因此访问速度快,但是数量有限,通常用于循环变量。
例如:
#include <stdio.h> void func() { // 自动变量 auto int x = 10; // 注册变量 register int y = 20; } int main() { func(); return 0; }
注意,自动变量和注册变量都是局部变量,仅在函数内部有效。
还有一些附加的变量类型:
- 指针变量:存储一个内存地址的变量。指针变量可以用来存储一个变量的内存地址,并通过指针访问这个变量。
例如:
#include <stdio.h> int main() { int x = 10; int *p; // 定义指针变量 p p = &x; // 存储 x 的内存地址 printf("x 的值是 %d\n", x); printf("x 的内存地址是 %p\n", &x); printf("p 的值是 %p\n", p); printf("*p 的值是 %d\n", *p); return 0; }
输出结果:
x 的值是 10 x 的内存地址是 0x7fff5d72d97c p 的值是 0x7fff5d72d97c *p 的值是 10
C语言输入输出
在 C 语言中,可以使用标准库中的输入输出函数来完成输入输出操作。
例如,使用 printf()
函数进行输出:
#include <stdio.h> int main() { printf("Hello, World!\n"); return 0; }
使用 scanf()
函数进行输入:
#include <stdio.h> int main() { int x; printf("请输入一个整数:"); scanf("%d", &x); printf("你输入的数是 %d\n", x); return 0; }
注意,在使用 scanf()
函数时,需要传入变量的内存地址,因为 scanf()
函数会直接修改变量的值。