文章目录
- 基本认识一下,不做深入了解,知道有这么个概念。
常量
在 C 语言中,常量是指在程序运行过程中其值不能被改变的量,以下是 C 语言中常量的介绍:
1. 整型常量
- 十进制常量:由 0 - 9 的数字组成,不能以 0 开头(除了表示 0 本身),例如:123、-456、0 等。
- 八进制常量:以 0 开头,由 0 - 7 的数字组成,例如:0123(等于十进制的 83)、077(等于十进制的 63)。
- 十六进制常量:以 0x 或 0X 开头,由 0 - 9 和 A - F(或 a - f)组成,例如:0x1A(等于十进制的 26)、0Xff(等于十进制的 255)。
2. 浮点型常量
- 十进制形式:由整数部分、小数点和小数部分组成,例如:3.14、-0.5、0.0 等。
- 科学计数法形式(指数形式):由尾数、e(或 E)和指数组成,例如:1.23e4(表示 1.23×10⁴)、-5.67e - 2(表示 - 5.67×10⁻²)。
3. 字符常量
- 普通字符常量:用单引号括起来的单个字符,例如:‘a’、‘A’、‘9’、’ '(空格字符)等。在内存中存储的是该字符对应的 ASCII 值(整数)。
- 转义字符常量:以反斜杠(\)开头的特殊字符序列,用于表示一些不可打印的字符或具有特殊意义的字符,例如:‘\n’(换行符)、‘\t’(制表符)、‘\0’(字符串结束标志,其 ASCII 值为 0)等。
4. 字符串常量
- 用双引号括起来的字符序列,例如:“Hello”、“123”、“”(空字符串)等。在内存中存储时,系统会自动在字符串的末尾添加一个字符串结束标志’\0’。
5. 符号常量
- 通过预处理指令#define 来定义,例如:
#define PI 3.14159 #define MAX_SIZE 100
- 在程序编译前,所有出现符号常量的地方都会被替换成对应的常量值。这种方式可以提高程序的可读性和可维护性,方便对常量进行统一修改。
字符串、转义字符、注释
字符串
- 定义:字符串是由双引号括起来的字符序列,例如:
"Hello World"
、"C programming"
等。在 C 语言中,字符串实际上是一个以'\0'
(空字符)作为结束标志的字符数组。 - 存储方式:当定义一个字符串常量时,编译器会自动在字符串末尾添加
'\0'
。例如,char str[] = "abc";
在内存中存储为'a'
、'b'
、'c'
、'\0'
。 - 操作:可以使用字符串相关的函数对字符串进行操作,比如
strcpy
(复制字符串)、strcat
(连接字符串)、strlen
(获取字符串长度)等。这些函数通常包含在<string.h>
头文件中。
转义字符
- 概念:转义字符是以反斜杠
\
开头的特殊字符序列,用于表示一些不可打印的字符或者具有特殊意义的字符。 - 常见转义字符:
\n
:换行符,将光标移到下一行的开头。\t
:制表符,在输出中用于水平制表,通常相当于按下 Tab 键。\b
:退格符,将光标向左移动一个位置。\r
:回车符,将光标移到当前行的开头。\0
:字符串结束标志,其 ASCII 值为 0。\\
:反斜杠字符本身。\'
:单引号字符。\"
:双引号字符。
- 关于ASCII码表:键盘上所有的字母、标点符号等都是转换为ASCII值存储在内存中。可以找一份ASCII码表看看。
注释
- 单行注释:以
//
开头,从//
开始到本行末尾的所有内容都被视为注释,例如:// This is a single - line comment int a = 10; // This part after // is also a comment
- 多行注释:以
/*
开头,以*/
结尾,/*
和*/
之间的所有内容都是注释,可以跨越多行,例如:/* This is a multi - line comment */ int b = 20;
语句
选择语句
int main()
{
int coding = 0;
printf("你会去敲代码吗?(选择1 or 0):>");
scanf("%d", &coding);
if(coding == 1)
{
prinf("坚持,你会有好offer\n");
}
else
{
printf("放弃,回家卖红薯\n");
}
return 0;
}
循环语句
include <stdio.h>
int main()
{
printf("好好学习\n");
int line = 0;
while(line<=20000)
{
line++;
printf("我要继续努力敲代码\n");
}
if(line>20000)
printf("赢取白富美\n");
return 0;
}
函数
int main()
{
int num1 = 0;
int num2 = 0;
int sum = 0;
printf("输入两个操作数:>");
scanf("%d %d", &a, &b);
sum = num1 + num2;
printf("sum = %d\n", sum);
return 0;
}
- 上述代码,写成函数如下。:简化代码,代码复用。
#include <stdio.h>
int Add(int x, int y)
{
int z = x+y;
return z;
}
int main()
{
int num1 = 0;
int num2 = 0;
int sum = 0;
printf("输入两个操作数:>");
scanf("%d %d", &num1, &num2);
sum = Add(num1, num2);
printf("sum = %d\n", sum);
return 0;
}
数组
- 怎么存储1-10的数字呢?数组 :一组相同类型数据的集合。集合里的每一项称为元素。
int arr[10] = {1,2,3,4,5,6,7,8,9,10};//定义一个整形数组,最多放10个元素
- 数组的使用
int main()
{
int i = 0;
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
for(i=0; i<10; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
操作符
算术操作符
- 加法(+):用于计算两个数的和,例如
3 + 5
的结果是8
。 - 减法(-):计算两个数的差,如
7 - 4
得到3
。 - 乘法(*):实现两个数相乘,像
2 * 6
等于12
。 - 除法(/):进行除法运算,注意当两个整数相除时,结果只取整数部分(向下取整),例如
5 / 2
结果为2
;如果至少有一个操作数是浮点数,则进行正常的浮点数除法,如5.0 / 2
或5 / 2.0
结果为2.5
。 - 求余(%):也称为取模运算,得到两个整数相除的余数,例如
7 % 3
的余数是1
。
关系操作符
- 大于(>):判断左边的操作数是否大于右边的操作数,例如
5 > 3
结果为真(在 C 语言中通常用非零值表示真)。 - 小于(<):判断左边操作数是否小于右边,如
2 < 4
为真。 - 大于等于(>=):左边操作数大于或等于右边时为真,例如
4 >= 4
为真。 - 小于等于(<=):左边操作数小于或等于右边时为真,像
3 <= 3
为真。 - 等于(==):判断两个操作数是否相等,注意与赋值操作符
=
区分,例如3 == 3
为真。 - 不等于(!=):当两个操作数不相等时为真,如
5!= 3
为真。
逻辑操作符
- 逻辑与(&&):当且仅当两个操作数都为真(非零)时,整个表达式为真,例如:
(3 > 2) && (5 < 7)
结果为1
,如果第一个操作数为假,则不会再计算第二个操作数(短路求值)。 - 逻辑或(||):只要两个操作数中有一个为真,整个表达式为真,如
(2 > 3) || (4 < 5)
结果为1
,同样有短路求值的特性,如果第一个操作数为真,则不会计算第二个操作数。 - 逻辑非(!):对操作数取反,若操作数为真(非零),则
!
操作后为假(0
),若操作数为假(0
),则!
操作后为真(1
),例如:!(3 == 4)
结果为1
。
位操作符
- 按位与(&):对两个整数的二进制位进行与运算,只有对应的两个二进制位都为 1 时,结果位才为 1,例如
3 & 5
(二进制分别为011
和101
)结果为1
(二进制001
)。 - 按位或(|):对应的两个二进制位只要有一个为 1,结果位就为 1,如
3 | 5
结果为7
(二进制111
)。 - 按位异或(^):当对应的两个二进制位不同时,结果位为 1,否则为 0,例如
3 ^ 5
结果为6
(二进制110
)。 - 按位取反(~):将操作数的每一位二进制位取反,例如
~3
(二进制011
)结果为-4
(二进制100
,在有符号整数的补码表示中)。
赋值操作符
- 基本赋值(=):将赋值操作符右边表达式的值赋给左边的变量,例如:
int x = 5;
、float y = 3.14;
。 - 复合赋值:
+=
:a += b
等价于a = a + b
,例如:int a = 3; a += 2;
(此时a
的值变为5
)。-=
:a -= b
等价于a = a - b
。*=
:a *= b
等价于a = a * b
。/=
:a /= b
等价于a = a / b
。%=
:a %= b
等价于a = a % b
。
左移操作符、右移操作符
左移操作符(<<)
- 基本概念
- 左移操作符将一个数的各二进制位全部左移若干位。
- 移动规则
- 左边移出的高位丢弃,右边空出的低位补 0。
- 数学意义
- 对于一个无符号整数,左移 n 位相当于乘以 2 的 n 次方。例如,将无符号整数 5(二进制为 00000101)左移 2 位,得到 20(二进制为 00010100),因为 5 * 2² = 20。
- 示例代码
#include <stdio.h>
int main() {
unsigned int num = 5;
unsigned int result = num << 2;
printf("左移 2 位后的结果:%u\n", result);
return 0;
}
右移操作符(>>)
- 基本概念
- 右移操作符将一个数的各二进制位全部右移若干位。
- 移动规则
- 对于无符号数,右边移出的低位丢弃,左边空出的高位补 0。
- 对于有符号数,如果是正数,高位补 0;如果是负数,在大多数编译器中,高位补 1(算术右移),但也有些编译器可能采用逻辑右移(高位补 0)。
- 数学意义
- 对于无符号数和正数,右移 n 位相当于除以 2 的 n 次方(向下取整)。例如,将无符号整数 8(二进制为 00001000)右移 1 位,得到 4(二进制为 00000100),因为 8 / 2 = 4。
- 示例代码
#include <stdio.h>
int main() {
unsigned int num1 = 8;
int num2 = -8;
unsigned int result1 = num1 >> 1;
int result2 = num2 >> 1;
printf("无符号数右移 1 位后的结果:%u\n", result1);
printf("有符号数(负数)右移 1 位后的结果:%d\n", result2);
return 0;
}
自增和自减操作符
- 自增(++):
- 前置自增
++i
,先将变量i
的值增加1
,然后再使用i
的值,例如:int i = 3; int j = ++i;
此时j
的值为4
,i
的值也为4
。 - 后置自增
i++
,先使用变量i
的当前值,然后再将i
的值增加1
,例如:int i = 3; int j = i++;
此时j
的值为3
,i
的值为4
。
- 前置自增
- 自减(–):
- 前置自减
--i
,先将变量i
的值减少1
,然后再使用i
的值。 - 后置自减
i--
,先使用变量i
的当前值,然后再将i
的值减少1
。
- 前置自减
条件操作符(三目运算符)
- 格式为
表达式1? 表达式2 : 表达式3
,先计算表达式1
,如果表达式1
的值为真(非零),则整个表达式的值为表达式2
的值,否则为表达式3
的值,例如:int max = (a > b)? a : b;
用于求a
和b
中的最大值。
逗号操作符
- 逗号操作符可以将多个表达式连接起来,从左到右依次计算各个表达式的值,整个逗号表达式的值是最后一个表达式的值,例如:
int x = (1, 2, 3);
此时x
的值为3
。
指针操作符
- 取地址符(&):用于获取变量的内存地址,例如:
int a = 5; int *p = &a;
这里&a
表示获取变量a
的内存地址,并将其存储在指针变量p
中。 - 解引用符(*):用于访问指针所指向的内存单元的值,例如:在
int a = 5; int *p = &a;
之后,*p
就表示访问p
所指向的内存单元(即变量a
的值),可以进行赋值操作*p = 10;
此时变量a
的值也变为10
。
sizeof 操作符
- 用于获取数据类型或者变量所占用的字节数,例如:
sizeof(int)
返回int
类型在当前系统中占用的字节数,sizeof(a)
返回变量a
所占用的字节数。 - (类型):(int)强制转换为int类型 ,(char)强制转换为char类型。