目录
前言
开发环境:vscode,在vscode中配置C语言,具体操作主要看第一章。
第一章 使用vscode编程C语言遇到的问题和解决方法
问题 | 解决方案 |
安装vscode+配置C语言环境 | (27条消息) VSCode配置C语言环境(完整版)_vscode c语言_SchizophreniA6的博客-CSDN博客到安装编译器部分+(26条消息) 【亲测可用】VsCode配置C语言环境_柒月流火赏心头的博客-CSDN博客从文件配置开始到最后。 |
汉化 | Ctrl+shift+p打开命令面板——输入display——找到configure language display——选择中文简体 |
安装vscode速度慢 | 打开下载列表——复制链接地址——改成下图所示。 |
在vscode中extern关键词用不了 | 设置Code Runner可以编译多文件。文件——首选项——设置——搜code runner——选中code-runner:Excutor Map 下面的“在settings json中编辑”——把该句改成如下形式即可。 "c": "cd $dir && gcc *.c -o $fileNameWithoutExt && $dir$fileNameWithoutExt", |
vscode中一使用scanf( )语句就显示code is already running! | 配置中搜code runner——点击设置图标——选择扩展设置——勾选code-runner:run in terminal |
终端中文乱码 | (28条消息) 跳坑之路 | 解决VScode“终端输出“乱码问题_vscode运行窗口出来的是乱码_天干物燥。的博客-CSDN博客 |
Vscode卡顿 | 以管理员身份打开即可。 |
第二章 初识C语言
首先main()函数是程序的主函数,是整段代码的开端。通常和return 0 搭配使用。如果不写return 0 会报错。这个return可以理解成是回调的意思——如果我需要1值,也可以回调1;需要其他变量的值,也可以直接回调这个变量。
在程序中需要用到打印函数printf()-print function()和输入函数scanf()——因此需要声明自带库函数stadio.h——standard input output标准化的输入输出——声明方式#include<stadio.h>
#include<stdio.h>
int main(){
int num1=0;
int num2=0;
int sum = 0;
scanf("%d%d",&num1,&num2);//取地址符号&
sum = num1 + num2;
printf("%d\n",sum);
return 0;
}
2.1数据类型
数据类型分别有char字符类型/int整型类型/short短整型类型/long长整型/long long更长整型/float浮点型/double双精度浮点型
根据变量类型选择合适的关键词来定义变量。例程如下。
#include<stdio.h> //要用c语言自带的库函数,因此需要写
//stdio——standard input output
// int a = 100;
int main(){ //main主程序——程序的入口
//char
char ch; //字符
ch = 'A';
printf("%c\n",ch);//%c 打印字符
//int
int age; //整型
age = 20;
printf("%d\n",age); //%d 打印整形十进制数字
//short
short size=50;//短整型 short int
printf("%d\n",size);
//long
long num=100; //长整型 long int
printf("%d\n",num);
//float
float f=5.0; //浮点型。小数点后包含6个小数位
printf("%f\n",f);
//double
double d=3.14;
printf("%lf\n",d);
return 0;
}
各类型所占内存
计算机内存单位:bit比特(位)/byte字节/Kb/Gb/Mb/Tb/Pb
1byte = 8 bit
1Kb = 1024 byte
1Mb = 1024 Kb ...依次类推
如何看到每个类型占多大内存呢?——sizeof()函数——该函数计算的是变量/类型所占空间的大小,单位是字节
其中sizeof(long)可以是4也可以是8——只要sizeof(long)>=sizeof(int)即可
#include<stdio.h>
int main(){
//计算机单位:bit比特 byte字节 kb mb gb tb pb
printf("%d\n",sizeof(char)); //1字节byte=8比特bit
printf("%d\n",sizeof(short)); // 2字节
printf("%d\n",sizeof(int)); //4
printf("%d\n",sizeof(long));//4 sizeof(long)>=sizeof(int)即可
printf("%d\n",sizeof(long long));//8
printf("%d\n",sizeof(float));//4
printf("%d\n",sizeof(double));//8
return 0 ;
}
2.2变量和常量
2.2.1变量及其各自作用域
全局变量——定义且作用在整个程序中的变量,可以被所有函数或对象所使用。作用域是整个程序
局部变量——定义且作用在某一个函数或者对象中的变量——也可以理解为是定义在{}内定义的。作用域就是{}内。——当{}结束,局部变量的生命周期就结束。
外部变量——定义在另一个文件中的变量,在该文件中使用。例如:在sum.c文件中定义g_val,随后在test.c中引用。——需要用到extern关键词
如果全局变量和局部变量的变量名称相同,局部变量优先,所以建议两者变量不要一致。
test.c
int a = 100;
int main(){
int a = 10;
printf("%d\n",a); //当局部变量和全局变量的名字相同,局部变量优先
extern int g_val; //extern声明外部符号
printf("g_val = %d\n",g_val);
return 0;
}
sum.c
int g_val =2023;
2.2.2常量
1.定义方式
(1)直接写数字
(2)const——定义常变量——常变量:具有常属性的变量,本质还是变量。
#include<stdio.h>
int main(){
//1.直接定义-const-常变量-是具有常属性的变量,本质还是变量
const int num=4;
printf("%d\n",num);
return 0;
}
如果定义数组,直接用法1即可,那就会有同学思考,用法2是否也可以呢?——必然不能!我们可以简单理解arr[常量]。虽然类型是const常变量给num赋值10,但是本质还是变量不是常量,所以这样使用系统会报错。
int main(){
//法1
int arr[10]={0};
//法2 ×
coust num = 10;
int arr[num]={0};
return 0 ;
}
(3)用#define——定义标识符常量——注意:使用时后面不加“ ;”
#define MAX 10
int main(){
int arr[MAX] = {0};
return 0;
}
(4)枚举常量——enum是关键词
其中male,female,secret都为枚举常量。分别代表0,1,2
#include<stdio.h>
enum Sex
{
male,
female,
secret
};
int main(){
enum Sex s = female;
printf("%d\n",s); //1
printf("%d\n",male); //0
printf("%d\n",female); //1
printf("%d\n",secret); //2
return 0;
}
2.3字符串、转义字符、注释
2.3.1字符串类型
定义方式用char类型,一个字符就用char 变量名,一个字符串就用 char 数组名[长度]
其中需要注意的是字符串的结束标志是'\0',值为0,不能算是字符串内容。
char arr2[ ]={'a','b','c'}; 为什么会输出随机值呢?——首先我们没有给数组定义长度,只定义了数组前三位分别是'a','b','c', 那么随后的字符就是随机的,因此只能到出现'\0'的时候才能结束,随即出现随机值。
#include<stdio.h>
#include<string.h>
//字符串类型
int main(){
char arr1[]="abc";
//"abc"--'a','b','c','\0' 这个'\0'是字符串的结束标志,值为0,不算是字符串内容
char arr2[]={'a','b','c'};
char arr3[]={'a','b','c',0};
printf("%s\n",arr1); //abc
printf("%s\n",arr2); //abc...
printf("%s\n",arr3); //abc
printf("%d\n",strlen(arr1)); //3
printf("%d\n",strlen(arr2));//输出随机数
printf("%d\n",strlen(arr3)); //3
return 0;
}
2.3.2 转义字符
由于脚本环境的编写规则,如果直接以常规方式表达字符可能失效。例如:想要换行,常规来说就是回车就可以了,但是计算机脚本环境中不显示回车,于是就需要使用\n表示回车换行。所以就需要用一个字符来表示这类符号,我们叫做转义字符。
其中需要注意的就是\ddd以及\xhh。\ddd其中ddd表示的是1-3位的八进制数字(0-7)再由加权和的方法求出改八进制所对应的十进制,从而在ASCII码表中找到对应的字符。\xhh中hh表示1-2位的十六进制数(0-9、A-F)之后方法同上。
(如果有同学不懂二进制、八进制、十进制、十六进制的相互转换,可以在目录直接跳转到补充部分)
#include<stdio.h>
int main(){
//转义字符--转变原来的意思
printf("%d\n",strlen("c:\test\32\test.c"));// \ddd,其中ddd表示1-3个八进制数字
printf("%s\n","c:\test\32\test.c");
// '\32'32表示8进制数字--对应十进制为26--26在ASCII码中代表字符->
printf("%c\n",'\137');
printf("%c\n",'\x61'); // \xdd--dd表示2个十六进制数
return 0;
}
2.3.3 注释
单条语句可以直接用//,整段可以ctrl+/
2.4选择语句、循环语句、函数
2.4.1 选择语句
在第一节中主要熟悉一下if选择语句,详细的在随后专题中会讲到。
情景:如果好好学习就会拿到好offer,否则就会去卖红薯。
程序编写:如果if(好好学习)就打印“好offer”,否则else 打印“卖红薯”。——>计算机语言识别的是二进制,所以需要给好好学习赋个值。这里使用的1是好好学习,0是不好好学习,并存在input变量中。
#include <stdio.h>
int main(){
int input = 0;
printf("你要好好学习吗?(1/0)>:");
scanf("%d",&input);
if (input == 1)
printf("好offer\n");
else
printf("卖红薯\n");
return 0;
}
2.4.2 循环语句
while\do...while\for
情景:如果想当程序员,一个重要的判断指标就是是否能敲够20000条有效代码,假设我们每天敲一条。——>如果我们每天敲一条,看是否到了20000条,如果到了就会拿到好offer,如果没有到,就继续写代码。——>由情景描述可以直到需要用到循环语句和选择语句。
转换成程序语言:首先比较理解的就是if(代码行数line>=20000) 就打印“好offer”——>使用line就要定义line——>只要while(line<=20000),我们就要一直写line++直到20000
#include <stdio.h>
int main(){
int line = 0;
while (line <= 20000)
{
line++;
printf("敲一行代码%d\n",line);
}
if (line > 20000)
{
printf("好offer");
}
return 0;
}
2.4.3 函数
函数定义规范:函数返回类型 函数名(参数类型 变量名1,参数类型 变量名2,...)
如果想要计算两个数相加,我们只需要把加法运算封装成一个函数,有需要就调用即可。
#include <stdio.h>
int Add(int x,int y){
int z = x + y;
return z;
}
int main(){
int num1 = 10;
int num2 = 20;
int sum = 0;
sum = Add(num1,num2);
printf("%d\n",sum);
return 0;
}
第三章 作业练习
比较两个数字的大小。
法1:直接比较(直接赋值给变量,进行比较\自主输入值进行比较)。
法2:用函数封装比较算法,创建一个变量来调用函数。
法3:用三目运算符 。(先浅认识一下,随后细说)
#include<stdio.h>
//法1
// int main(){
// int max,num1,num2;
// scanf("%d%d",&num1,&num2);
// if (num1>num2)
// max = num1;
// else max = num2;
// printf("%d\n",max);
// return 0 ;
// }
//法2
int compare(int x,int y){
int z = 0;
if (x>y) z = x; //return x
else z = y; //return y
return z;
}
int main(){
int max = 0,num1,num2;
scanf("%d%d",&num1,&num2);
max = compare(num1,num2);
printf("%d",max);
return 0 ;
}
//法3
// int main(){
// int max,num1,num2;
// scanf("%d%d",&num1,&num2);
// max = num1>num2? num1:num2; //表达式?结果1:结果2
// printf("%d\n",max);
// return 0;
// }
补充:二进制B、八进制O、十进制D、十六进制H的互相转化
参考下面博客
cd(8条消息) 计算机基础进制转换(二进制、八进制、十进制、十六进制)_计算机进制_daixiangcn的博客-CSDN博客