字符串+转义字符+注释
字符串
字符串里可以只有一个字符
字符串的结束标志是一个’\0’的转义字符
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[4] = "abc";
char arr2[3] = {'a', 'b', 'c'};
char arr3[4] = { 'a', 'b', 'c', '\0' };
printf("%s\n", arr1); //输出abc
printf("%s\n", arr2); //输出abc烫烫烫烫蘟bc
printf("%s\n", arr3); //输出abc
printf("%d\n", strlen(arr1)); //输出 3
printf("%d\n", strlen(arr2)); //输出 15 - 随机值
printf("%d\n", strlen(arr3)); //输出 3
return 0;
}
arr1的结尾默认放了一个’\0’ ,而arr2后面没有’\0’作为结束标志,所以打印会出现随机值
求字符串长度——strlen
,需要包含头文件#include <string.h>
strlen
是用来获取字符串的有效长度的,结尾标记’\0’不包含在内
‘\0’是结束标志,不算作字符串内容,但’\0’是一个字符(一个汉字占2个字符),占1Byte大小
转义字符
转义字符
?
’
"
\
\a
\b
\f
\n
\r
\t
\v
\ddd
\xdd
释义
在书写连续多个问号时使用,防止他们被解析成三字母词(即?)
用于表示字符常量’(即’)
用于表示一个字符串内部的双引号(即")
用于表示一个反斜杠,防止它被解释为一个转义序列符(即\)
警告字符,蜂鸣
退格符(删掉前一个字符,即BACKSPACE)
进纸符
换行
回车
水平制表符(与TAB等价)
垂直制表符
ddd表示1~3个八进制的数字转化为十进制所对应ASCII码值所对应的字符,如:‘\61’表示’1’,‘\101’表示’A’
dd表示1~2个十六进制数字转化为十进制所对应ASCII码值所对应的字符,如:‘\x30’表示’0’
n进制转换十进制:权重
\130代表的是把130这个八进制数数字转换成十进制后得到的88,作为ASCII码值代表的字符
ASCII码值最大是127,不能超出
注释
作用:
- 解释代码
- 注释掉一些不需要的代码
注释风格
- /code/
缺点:无法嵌套注释
/*
code
/* code */
code
*/
- //code
CTRL+K,CTRL+U 注释
CTRL+K,CTRL+C 取消注释
选择语句
- if
- switch
int input = 0;
printf("加入比特学习\n");
printf("你会好好学习吗?(1/0)");
scanf("%d", &input);
//也可写if (1 == input),但不能写=,因为常量不能改
if (input == 1) // == 表示判断,=表示赋值,此处绝对不能写=,否则表示:
{ //把 input 赋值为1,再判断input是否为1
printf("好offer\n"); //此时input永远为1,永远好offer,是错误的写法
}
else
{
printf("卖红薯\n");
}
循环语句
- while
- for
- do while
int line = 0;
printf("加入比特\n");
while (line < 20000)
{
printf("敲代码:%d\n", line);
line++;
}
if (line = 20000) //注意此处可以没有 {}
printf("好offer\n");
else (line < 20000) //无法达成
printf("好好学习\n");
C语言是一种【结构化】的程序设计语言
顺序结构
选择结构
循环结构
函数
函数的特点就是简化代码,代码复用
int Add(int x, int y) //自定义一个 Add 函数
{
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;
}
数组
数组是一组相同类型元素的集合
int arr[] = { 1,2,3 },数组可以通过初始化确定大小
数组定义
int arr[10] = {1,2,3,4,5,6,7,8,9,10};//定义一个整型数组 arr ,最多放10个元素
char ch[10] = "hello bit";
数组下标
C语言规定:数组的每个元素都有一个下标,下标是从0开始的
数组可以通过下标来访问的
比如:
int arr[10] = {0}; //如果数组10个元素,下标依次是0-9;
//若第一个元素设置为1,其余元素也会被默认初始化为0
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
printf("%d", arr[8]); //会打印9
数组的使用
int main()
{
int i = 0;
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
while (i < 10)
{
printf("%d ", arr[i]); //此处在访问数组的一个元素,而不是在定义数组
i = i+1; //所以可以用变量 i
}
return 0;
}
定义数组 arr[ ] 中部分编译器可以写变量,使用的是 C99 标准中引入的【变长数组】,但 VS2022 对此标准支持不好,所以 VS 里面无法使用
操作符
算术操作符
+ - * / %
加 减 乘 除 取模
printf("%d", 7 / 3);//输出2
printf("%f", 7.0 / 3);//输出2.333333
printf("%f", 7 / 3.0);//输出2.333333
printf("%f", 7.0 / 3.0);//输出2.333333
printf("%d", 7 % 3);//输出1
printf("%d", 7.0 % 3);//错误,取模操作符只适用于整数
移位操作符
涉及到二进制位,移动二进制位,是二进制操作符
>> <<
右移 左移
位操作符
涉及到二进制位,也是二进制操作符
& ^ |
按位与 按位异或 按位或
(复合)赋值操作符
= += -= *= /= &= ^= |= >>= <<=
//初始化
int a = 0;
//赋值
a = 20;
a = a + 10;
a += 10; //复合赋值符 等同于 a = a + 10
单目操作符
只有一个操作数
! 逻辑反操作
- 负值
+ 正值 //+ 加号有2个操作数,也是双目操作符
& 取地址
sizeof 操作数的类型长度(以字节为单位)//操作符(运算符),不是函数
~ 对一个数的二进制按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
C语言中,0表示假,非0表示真
!
if (flag)//若flag为真,进入if
{
;
}
if (!flag)//若flag为假,进入if
{
;
}
+ -
int a = -10;
int b = -a;//b为10
b = +a;//b依然为-10,+用的较少
++ --
int a = 10;
int b = ++a;//前置++,先+1,后使用,相当于a = a + 1,b = a
printf("a=%d b=%d\n", a, b);//输出a=11 b=11
a = 10;
b = a++;//后置++,先使用,后+1,相当于b = a,a = a + 1
printf("a=%d b=%d\n", a, b);//输出a=11 b=10
a = 1;
b = (++a) + (++a) + (++a);//在不同编译器的结果不同,是错误的代码,原因:计算路径不唯一
()
int a = 3.14;
printf("%d\n", a);//输出3(只取整数位,不会四舍五入),但会警告
a = (int)3.14;//强制类型转换
printf("%d\n", a);//无警告
关系操作符
> 大于
>= 大于等于
< 小于
<= 小于等于
!= 用于测试“不相等”
== 用于测试“相等”
int a = 0;
if (a == 5) //此处绝对不能写=,原因见上文选择语句代码块内注释
{
printf("hehe");
}
逻辑操作符
&& 逻辑与(并且)
|| 逻辑或(或者)
&& ||
int a = 5;
int b = 4;
if ((a == 3) && (b == 4))
{
printf("hehe"); //不同时满足条件,不打印
}
if ((a == 3) || (b == 4))
{
printf("hehe"); //满足至少一个条件,打印
}
条件操作符
三目操作符(C语言唯一)
exp1 ? exp2 : exp3
//求较大值
int a = 3;
int b = 5;
int m = 0;
if (a > b)
m = a;
else
m = b;
//条件操作符写法
m = (a > b) ? (a) : (b);//若表达式1成立,执行表达式2,表达式2的结果作为整个表达式的结果;若表达式1不成立,执行表达式3,表达式3的结果作为整个表达式的结果
m = a > b ? a : b;//写法2
m = ((a > b) ? (a) : (b));//写法3
逗号表达式
exp1, exp2, exp3, …expN
逗号表达式从左向右依次计算,整个表达式的结果是最后一个表达式的结果
int a = 3;
int b = 20;
int c = 0;
int d = (a += 3, b = 5, c = a + b, c - 4);
printf("%d\n", d);//输出7
下标引用、函数调用和结构成员
[] () . ->
下标引用 函数调用 结构体成员
[]
int arr[10] = { 0 };
arr[5] = 9; //把 9 赋给 arr中下标为 5 的元素,它的操作数:数组名arr、下标5
()
int get_max(int x, int y)//这个不是函数调用操作符,只是语法规定
{
if (x > y)
return x;
else
return y;
}
int main()//这个不是函数调用操作符,调用main函数的才是函数调用操作符
{
int m = get_max(3, 5);//此时的函数调用操作符是三目操作符,它的操作数是:函数名get_max,3,5
return 0;
}