实用技巧

常用快捷键

  1. 复制粘贴剪贴撤回: Ctrl + c / v / x / z

  2. 移动代码块: Alt + 上下 或 鼠标拖动

  3. 快速复制: Alt + Shift + 上下

  4. 注释代码: Ctrl + /

  5. 缩进: Tab / Shift + Tab

  6. 删除单个单词: Ctrl + Backspace

  7. 切换窗口: Ctrl + Tab 应用内切换窗口
    Alt + Tab 切换所有窗口
    Win + Tab 切换应用

使用工具 & 软件

  1. 截图: Ctrl + Alt + A (QQ) / Win + Shift + S (系统)

  2. 录制: Win + G(系统) / OBS

  3. 笔记: Typora, Obsidian, 飞书云文档, Hexo搭建博客

  4. 视频课资源: MOOC,BiliBili

  5. 文件查找: everything

  6. 思维导图: Xmind

  7. 电脑防护: 火绒

  8. 博客 & 文档: 知乎,稀土掘金,Stack Overflow,Github,GPT

输入输出

格式化输入输出

1
2
3
4
5
6
7
8
9
10
11
12
13
// 有参数时
printf("格式化字符",参数列表);
// 没有参数时
printf("非格式字符串");

#include<stdio.h>
int main()
{
int value = 6;
char ch = 'w';
float f = 2.0;
printf("%d %c %f\n",value,ch,f);/*输出变量,变量之间空格,并在最后换行*/
}

输入

首先,scanf函数在读取除字符之外的输入的时候会遵守以下原则:
scanf函数每次读取一个字符,跳过所有的空白字符,直到遇到第一个非空白字符的时候才开始读取。

然后,scanf以删除的方式从缓冲区读入数据(来自标准输入设备的数据存储在缓冲区)
也就是说,scanf从缓冲区读入一个数据项,该数据项在缓冲区中就被清除掉了。而如果scanf需要读取一个数据项,发现缓冲区当前是空的,那么程序就会在scanf代码处阻塞,等待用户输入,scanf函数接收到相应的数据项之后,在缓冲区中将这一数据项清除,scanf函数返回,程序继续执行。

缓冲区

是内存空间的一部分。也就是说,在内存中预留了一定的存储空间,用来暂时保存输入或输出的数据,这部分预留的空间就叫做缓冲区。缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区_和输出缓冲区。_

scanf遇到空格,回车,tab都可以结束输入,gets只有回车能结束输入(至少输入一个字符或数字)

字符输入输出

字符输出函数—-putchar()

把从输出缓冲区中读取单个字符输出到标准输出设备

putchar(变量)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# include<stdio.h>
int main()
{
int i =67; /*定义一个整型变量*/
char ch = 'C'; /*定义一个字符变量*/

putchar(i); /*数字 67 的 ASCII是大写字母 C*/
putchar('\n'); /*换行效果,屏幕不显示*/
putchar(ch); /*输出字符变量*/
putchar('\n');
putchar('C'); /*输出字符常量*/

return 0;
}

字符输入函数—-getchar()

从输入缓冲区上读取单个字符,返回值是字符

1
2
3
4
5
6
7
8
9
10
11
# include<stdio.h>
int main()
{
char ch = 0;/*初始化变量*/

ch = getchar();/*字符输入*/
putchar(ch);/*输出变量*/
putchar('\n');/*换行*/

return 0;
}

字符串输入输出

我们在编程的时候,经常要对字符进行操作

字符串输出函数—-puts()

从缓冲区中读取已经存在的字符串(包括空白字符)输出到标准输出设备并换行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
puts(s);/*s 为字符串变量*/

# include<stdio.h>
int main()
{
char str[] = "hello world!";/*定义一个数组,储存了一串字符串*/
char* s=NULL; /*定义一个指针变量,初始化为空*/

s = "hello world!"; /*指针指向一个字符串*/
puts(str);/*输出字符串*/
puts(s);/*输出字符串*/

return 0;
}

格式里的字符串变量s在这里是数组 str 和指针 s。puts() 函数的作用与printf(“%s\n”,s)相同—–输出字符串并换行。

注 意:
①数组是同一类型的数据的集合,指针是用来表示内存地址的。后面会独立的介绍,在这里只要知道数组变量和指针变量可以存储字符串就行了。②puts()函数在遇到”\0”时,就会被替换为 “\n”,实现换行。

字符串输入函数—–gets()

读取输入缓冲区中存在的字符,直到遇到回车结束

1
2
3
4
5
6
7
8
9
10
11
12
13
# include<stdio.h>
int main()
{
char str[26] = { 0 };
char *s = NULL;/*定义一个数组和一个指针变量*/

gets(str);/*获取输入的字符串*/
gets(s);/*获取输入的字符串*/
puts(str);/*输出字符串*/
puts(s);/*输出字符串*/

return 0;
}

注意:
①用 gets 函数获取的字符串一般是放在字符变量里,也是使用数组变量和指针变量。gets 函数除了有输入字符的功能外,还有换行的作用。
②scanf()函数和gets()函数有明显区别,scanf函数在遇到空格、回车、空白符时结束输入,gets ()函数仅在遇到回车时结束输入。

代码规范

  1. 写注释
  2. 变量命名(不能太随便太奇怪)
  3. 空行:独立代码块之间要空行
    每个函数定义结束要空行等
  4. 缩进:if,switch,for等(条件下内部执行的语句要缩进)特殊:只有一条if可以放一行
  5. 分行:定义变量可以一个变量分一列
  6. 减少嵌套
  7. 空格:等号大小于号等双目运算符左右要空格(单目运算符前后不空格,如正负号)

分支

逻辑运算符

&&优先级大于||:在没有括号的情况下,||左右可以有带&&的组合式(优先结合&&)

if的括号里可以赋值,返回值就是赋的值:如if(a=0)则返回值是0,不执行结果

短路特性

  1. 如果if成立,
    不再执行后面的else if和else
  2. 如果&&的前面不成立,
    不再执行后面的内容
  3. 如果||的前面成立,
    不再执行后面的内容
    多用于if赋值的情形
1
2
3
4
5
// 短路特性 例子1-1
int a = 2, b = 3, c = 4;
if((a = a < b) || (c = 3)) {
printf("a = %d , c = %d", a, c);
}

如以上结果输出a=1,c=4
因为先判断a<b部分结果为真返回1赋值给a,那么此时a为1
那么在||运算符中前部分为真就已经可以使其生效,那么后面的c=3语句就不再执行

1
2
3
4
5
6
//例子1-2
int a = 2, b = 3, c = 4;
if((a /= b) && (c = a-b)) {
printf("qwq");
}
printf("a = %d , c = %d", a, c);

以上结果输出a=0,c=4
因为a /= b的结果保留整数为0,此时a为0
对于&&运算符必须前后都为真才能生效,那么前部分为0已经为假此语句已经失效,所以后面的c = a-b语句不再执行

三目运算符

1
计算结果=表达式1 ? 表达式2 : 表达式3

若表达式1为真执行表达式2,为假执行表达式3

并且三目运算符可以嵌套,例如

1
计算结果=表达式1   ?   表达式2   :   表达式3   ?   表达式4  :   表达式5

switch,case语句

case后面只能是整型或char类型的常量(即整数和单字符’ ‘里面可以是数字和大小写字母等,注意1和’1’是不一样的)

case后面只能是常量,我们可以预先定义常量:

  1. define定义

  2. const定义

循环

while循环

while循环的语法结构类似于if语句

while循环中一定要注意在循环体内调整循环的次数

for循环

for(初始化 ; 判断条件 ; 条件变量调整)
如for( a=1 ; a<6 ; a++ )
for循环的三个表达式都可以省略
for( ; ; )依然可以执行(无限/死循环)
表达式2只要不是0都可以执行(输入一个非零数字或者空着都代表无限/死循环)
☆如果第二项为“非”直接跳出循环,不再执行第三项
☆第三项为单纯的a++和++a没有区别,但如果在第三项中调用a的值,则不同

break和continue

无论是三个循环中的哪一个,都可以在循环体中任意位置使用break和continue,break的作用是在满足你设置好的条件语句后,结束循环,而continue是跳过循环体中在continue之后的所有语句,开始进入下一次循环的流程