目录
前言:
深度刨析问题
1.CSDN由于我的排版不怎么好看,我的有道云笔记比较美观,请移步有道云笔记
2.修炼必备
1)入门必备:VS2019社区版,下载地址:Visual Studio 较旧的下载 - 2019、2017、2015 和以前的版本 (microsoft.com)
2)趁手武器:印象笔记/有道云笔记
3)修炼秘籍:牛客网 - 找工作神器|笔试题库|面试经验|实习招聘内推,求职就业一站解决_牛客网 (nowcoder.com)
4)雷劫必备:leetcode 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
注:遇到瓶颈怎么办?百度百科_全球领先的中文百科全书 (baidu.com)
1.如何使用%c的形式打印\、'和"
#include
int main()
{
printf("%c\n", '\\');//打印'\'
printf("%c\n",'\'' );//打印'
printf("%c\n",'\"');//打印"
return 0;
}
2.定义数组的[]中能不能使用变量,能不能使用const修饰的变量
#include
int main()
{
int num = 10;
//数组的下标操作符中不能使用变量
//int arr[num] = { 1,2,3 };
const int data = 10;
//错误,虽然const修饰的变量不能改变,但是它本质上还是一个变量,不能使用
//int arr[data] = { 1,2,3,4,5 };
return 0;
}
3.字符串与字符数组的区别
#include
int main()
{
char arr1[] = { 'a','b','c','d' };
char arr2[] = "abcd";
//在相同字符的情况下,字符数组的大小比字符串的占用少1字节
printf("%d\n", sizeof(arr1));//4
printf("%d\n", sizeof(arr2));//5
//字符串有结束标志,字符数组无结束标志
printf("%d\n", strlen(arr1));//随机值
printf("%d\n", strlen(arr2));//4
return 0;
}
4.逻辑右移和算术右移
逻辑右移:低位丢弃,高位补0
算术右移:低位丢弃,高位补符号位
//11111111 11111111 11111111 11111111 -1的补码
//01111111 11111111 11111111 11111111 逻辑右移
//11111111 11111111 11111111 11111111 算术右移
5.sizeof算术符的内部会不会进行算术运算?求数据类型所占字节会不会出现整形提升?
1)sizeof内部是一个表达式的话,这个表达式不会进行计算的
2)sizeof内部的数据char、short会进行整型提升,占4个字节
#include
int main()
{
//sizeof内部是表达式的话不会进行算术运算
int a = 10;
printf("%d\n", a);//10
printf("%d\n", sizeof(a));//4
printf("%d\n", sizeof(a++));//4
printf("%d\n", sizeof(++a));//4
printf("%d\n", a);//10,没有进行表达式计算
char c = 8;
printf("%d\n", sizeof(c));//1
printf("%d\n", sizeof(+c));//4
printf("%d\n", sizeof(-c));//4
short b = 8;
printf("%d\n", sizeof(b));//2
printf("%d\n", sizeof(+b));//4
printf("%d\n", sizeof(-b));//4
return 0;
}
6.前置++/--和后置++/--的区别
1)前置++/--:先自增,再使用
2)后置++/--:先使用,再自增
#include
int main()
{
//1)前置++/--:先自增,再使用
int i = 10;
printf("%d\n", ++i);//11
//printf("%d\n", --i);//9
//2)后置++/--:先使用,再自增
int a = 10;
//printf("%d\n", a++);//10
printf("%d\n", a--);//10
return 0;
}
7.typedef的作用
——对类型进行重定义,然后声明变量的可以使用这个类型
#include
typedef unsigned int unit;//将unsigned int重定义为unit
int main()
{
//使用重定义的类型进行声明变量
unit num = 10;//等价于 unsigned int num = 10;
printf("%u\n", num);//10
return 0;
}
8.static的作用
1)修饰局部变量:使局部变量的生命周期变长(只被初始化一次,被初始化后一直存在)
#include
void test(int i)
{
//static修饰局部变量
static int num = 0;
num = i;
printf("%d\n", num);// 0 1 2 3 4 5 6 7 8 9
}
int main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
test(i);
}
return 0;
}
2)修饰全局变量:使全局变量只能在本文件内使用(全局变量具有外部链接属性)
//test.c
#include
extern int age;//引用外部的全局变量
//extern int age; 当使用static修饰的age会报错
int main()
{
printf("%d\n", age);//10
return 0;
}
//add.c
#include
int age = 10;
//static int age = 10;
3)修饰函数:使函数只能在本文件内使用(意思同上)
#include
//static修饰函数
static void test()
{
printf("test~");
}
int main()
{
test();
return 0;
}
9.指针是什么?
——指针就是地址,指针一般是存放变量的地址,我们一般常说的指针也叫做指针变量
#include
int main()
{
int num = 10;
//指针是用来存放其他变量的地址的
int* p = #
//看看指针是否存放的是num的地址
printf("%p\n", &num);
printf("%p\n", p);
return 0;
}
10.指针变量的大小
——32位平台下占4个字节,64位平台下占8个字节
#include
int main()
{
printf("%d\n", sizeof(char*));
printf("%d\n", sizeof(short*));
printf("%d\n", sizeof(int*));
printf("%d\n", sizeof(long*));
printf("%d\n", sizeof(long long*));
printf("%d\n", sizeof(float*));
printf("%d\n", sizeof(double*));
return 0;
}
32位平台:
64位平台:
11.结构体指针访问成员属性的形式
1)使用->访问
2)使用(*xx).属性访问
#include
struct Person
{
int age;
char gender;
};
typedef struct Person Person;
int main()
{
Person person = { 18,'m' };
Person* p = &person;
//结构体指针访问成员属性的形式
//形式1:使用->
printf("%d\n", p->age);//
printf("%d\n", p->gender);
//形式2:(*xx).属性
printf("%d\n", (*p).age);
printf("%c\n", (*p).gender);
return 0;
}
12.一个程序能有几个main函数?为什么
——一个程序只能有一个主函数(main),main函数是程序的入口,如果main函数多了程序不知道那个是入口,即报错
#include
int main(){}
int main(){}
13.C语言的栈区、堆区和静态区的区别
14.const对指针的作用?
1)const 放在*的前面,则指针所指向的变量的内容不能改变,但指针的指向能改变
2)const 放在*的后面,则指针所指向的变量的内容能改变,但指针的指向不能改变
#include
int main()
{
int a = 10;
int b = 11;
const int* p1 = &a;
//指向变量的内容不能改变
//*p1 = 20;
//能改变指向的变量
p1 = &b;
printf("%d\n", *p1);//11
int* const p2 = &a;
//指向变量的内容能改变
*p2 = 12;
printf("%d\n", *p2);//12
//不能改变指向的变量
//p2 = &a;
return 0;
}
15.extern关键字的作用
——引用其他文件的全局变量/函数
//test.c
#include
extern int age;
int main()
{
printf("%d\n", age);//20
return 0;
}
//add.c
int age = 20;
16.C语言有几种结构类型
1)顺序结构:代码从上到下依次执行,直到结束
#include
int main()
{
int a = 10;
int b = 20;
printf("%d\n", a + b);
return 0;
}
2)分支结构:代码在执行的过程中,会选择性的执行某段代码
#include
int main()
{
int a = 10;
int b = 9;
if (a > b)
{
printf("a > b\n");
}
else
{
printf("a < b\n");
}
return 0;
}
3)循环结构:代码循环执行某段代码
#include
int main()
{
int i = 0;
while (i < 10)
{
printf("believe youself, you can do it!!!\n");
i++;
}
return 0;
}
17.什么是语句?
——以分号结束的表达式/常量叫做语句;
#include
int main()
{
"abcdef";//分号结束
int num = 10;//分号结束
return 0;
}
18.多分支的执行规则
——某个分支的条件成立后,执行该分支,其他分支不再执行
#include
int main()
{
int score = 0;
scanf("%d", &score);
if (score > 0 && score < 60)
{
printf("成绩不合格\n");
}
else if (score >= 60 && score < 70)
{
printf("成绩一般\n");
}
else if (score >= 70 && score < 80)
{
printf("成绩良好\n");
}
else if (score >= 80 && score < 90)
{
printf("成绩优良\n");
}
else if (score >= 90 && score <= 100)
{
printf("成绩优秀\n");
}
else
{
printf("你输入的成绩有误,请重写输入~\n");
}
return 0;
}
19.switch()中表达式和case:后面的值的特点
1)switch中的表达式只能是整型表达式(char、short、int、long、long long)
2)case后面跟的值:只能是整型常量值
20.break/continue能不能在switch中使用,作用是什么
1)break能在switch中使用,使用后跳出switch语句,执行switch后的语句
2)continue不能再switch中使用
#include
int main()
{
int weekday = 0;
scanf("%d", &weekday);
double data = 4;
//switch(data){}()中只能为整型表达式
switch (weekday)
{
//case 1.0://错误,case的后面只能跟整型常量值且整型常量值不能重复
case 1:
printf("星期一\n");
break;
case 2:
printf("星期二\n");
break;
case 3:
printf("星期三\n");
break;
case 4:
printf("星期四\n");
break;
case 5:
printf("星期五\n");
break;
case 6:
printf("星期六\n");
break;
case 7:
printf("星期日\n");
break;
default:
printf("你输入的数字有误,请重新操作\n");
break;//好习惯
}
return 0;
}
21.break和continue在循环中的作用
1)break执行后跳出循环,执行循环后面的语句
2)continue执行后,跳过本次循环(即跳过continue后的语句),执行下一次循环
#include
int main()
{
int i = 0;
while (i < 10)
{
if (i == 5)
{
break;
}
printf("%d ", i);//0 1 2 3 4
i++;
}
i = 0;
while (i < 10)
{
if (i == 5)
{
continue;
}
printf("%d ", i);//0 1 2 3 4 死循环
i++;
}
return 0;
}
22.C语言有那些数据类型?
1)整型家族:char、short、int、long、long long
2)浮点型家族:float、double
3)构造类型:结构体、联合类型(union)、枚举类型(enum)、数组
4)指针类型
5)void型(常用于在形参和函数的返回类型)
#include
//空类型
void test(void){}
int main()
{
//整型家族
char a;
short b;
int c;
long d;
long long e;
//浮点型家族
float f;
double g;
//构造类型
//struct{};//里面需要填构造中的参数
//union{};
int arr[10];
enum{};
//指针类型
int* p1;
char* p2;
float* p3;
return 0;
}
23.画图详解char的范围
24. 什么是大端字节序和小端字节序?
1)小端字节序:数据的低字节存储在内存中的低地址处,高字节存储在内存中的高地址处
2)大端字节序:数据的低字节存储在内存中的高地址处,高字节存储在内存中的低地址处
——看该机器的低字节数据存储在内存中的低地址处还是高地址处
#include
int check_sys(int a)
{
//返回低地址的第一个字节的数据值
return (*(char*)&a);
}
int main()
{
int a = 1;
int ret = check_sys(a);
//返回比较
if (ret == 1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}
26.整形提升是对什么数据类型进行提升?
——整型提升只能使用于char和short类型,把char和short转化为int后进行计算
#include
int main()
{
char ch1 = 127;
//01111111
char ch2 = 3;
//00000011
char ch3 = ch1 + ch2;
//01111111 --> 127
//00000011 --> 3
//10000010 --> 补码
//11111111 11111111 11111111 10000010 整型提升
//10000010 截断
//10000001
//11111110 -126 结果
printf("%d %d\n", ch3, ch1 + ch2);//-126 130
return 0;
}
27.VS的调试技巧
1)F10 ---> 逐过程(跳过函数)
2)F9 ---> 打断点和取消断点(配合F5使用)
3)F11 ---> 逐语句(一句一句的调试)
4)F5 ---> 开始调试(配合F9使用)
28.异或运算符的性质
1)相同数异或为0
2)任何一个数与0异或是这个数本身
3)a ^ 0 = 0; a ^ b ^ b = a; b ^ b = 0;
#include
int main()
{
int a = 10;
int b = 10;
int c = 0;
int d = 5;
int ret = a ^ c;
int res = a ^ b ^ d;
printf("%d\n", ret);//10
printf("%d\n", res);//5
return 0;
}
29.如何判断一个数是不是偶数?
法一:取模运算:判断这个数的余数是不是不为1
法二:按位与运算:判断这个数&1的结果是不是0
#include
int main()
{
int num = 0;
scanf("%d", &num);
if (num & 1)
{
printf("%d是奇数\n", num);
}
else
{
printf("%d是偶数\n", num);
}
return 0;
}
#include
int is_judge_even(int num)
{
return num % 2;
}
int main()
{
int num = 0;
scanf("%d", &num);
if (is_judge_even(num))
{
printf("%d是奇数\n", num);
}
else
{
printf("%d是偶数\n", num);
}
return 0;
}
30.函数的格式
返回类型 函数名(形参列表……) {}
#include
void test()
{
printf("test...\n");
}
int main()
{
test();
return 0;
}