免费网站制作平台,社交网站建站,长葛哪里有做网站的,怎么注销公司法人身份准备工具Vscode或者Clion或者Dev C或者Vs studio 和 MSYS2 是C跨平台的重要工具链. 基础一 准备工作安装MSYS2软件 创建文件 一、基本介绍1.1C源文件1.2 代码注释1.3变量与常量1.3.1变量1.3.2 常量1.3.3 二者的区别#xff1a; 1.4 关键字和标识符 二、数据类型2.1 基本数据类…准备工具Vscode或者Clion或者Dev C或者Vs studio 和 MSYS2 是C跨平台的重要工具链. 基础一 准备工作安装MSYS2软件 创建文件 一、基本介绍1.1C源文件1.2 代码注释1.3变量与常量1.3.1变量1.3.2 常量1.3.3 二者的区别 1.4 关键字和标识符 二、数据类型2.1 基本数据类型:2.1.1整型:2.1.2 浮点型 (实数):保留指定位数的小数 2.1.3 字符型 (char 1个字节):2.1.3.1转义字符 2.1.4 布尔型 (bool): 2. 2 用户定义数据类型(后续:2.3 字符串型2.4 数据键入 三、运算符四、流程控制语句4.1 选择结构4.1.1 if语句 4.1.2 三目运算符4.1.3 switch语句注意事项 4.1.4 if和switch的区别【CHAT】4.2 循环结构4.2.1 while循环语句4.2.2 do...while循环语句 4.2.3 for循环语句九九乘法表 4.3 跳转语句4.3.1 break语句4.3.2 continue语句4.3.3 goto语句- goto关键字。 五、数组5.1 一维数组CLion中有错误cast from ‘int*’ to ‘int’ loses precision [-fpermissive]问题解决 冒泡排序C语言内置的qsort 5.2 二维数组 六、函数值传递如果想要改变实参 -- 互换地址的内容 准备工作
安装MSYS2 pacman -S mingw-w64-ucrt-x86_64-gcc 后Y
最后用cmd gcc --version 环境变量添加进去
软件
CLion
创建文件
右击–New–C/C Source File
一、基本介绍
1.1C源文件
该文件一般是以.cpp 或者 .cxx 后缀结尾的。
#includeiostream
using namespace std;
// main有且仅有一个
int main() {cout Hello C__world endl;//system(pause);return 0;
}main 函数只包含一行代码这个单条语句是以 std 开头然后以一个分号作为结尾 的。
1.2 代码注释
注释是一种编写代码时用来解释程序的作用和用途的特殊语句编译器会自动检测并忽略注释并不对程序功能产生任何影响。
格式 1单行注释 // 后接对代码的描述 放置在代码上方或者代码语句结束的结尾较好。
2多行注释/*多行注释*/ 这个由于可能代码篇幅可能较长所以推荐写在整体的上方。
1.3变量与常量
1.3.1变量
给一段指定的内存空间起名方便操作这段内存语法数据类型 变量名 初始值;
注意最好是在定义的时候给变量赋初值。因为变量是在操作指定的内存空间在定义变量的时候会找某一空间却不可保证改空间原先的值是没有的。
#includeiostream
using namespace std;int main() {//最好是在定义的时候给变量赋初值。int a 5;//带有中文输出的内容需要把编码格式改为GBKcout a 的值 a endl;system(pause);return 0;
}1.3.2 常量
不随任何的行为而改变自身数据语法 1#define 宏定义 #define 常量名 常量值 源文件的上方定义的
2const 修饰的变量 const 数据类型 常量名 常量值 被const修饰该变量为常量不可修改
1.3.3 二者的区别
虽两种方式都可以用来定义常量但仍存在一些区别 #define 宏常量: 使用预处理指令简单替换没有类型检查。不占用内存直接替换为常量值是简单的文本替换它将符号替换成相应的文本 即#define 定义的常量没有分配存储空间没有对应的地址。可以定义函数、表达式等不仅仅限于常数(define可以采用表达式作为名称)。宏不受作用域限制全局可用。 const修饰的变量: 是真正的变量具有数据类型会占用内存。因为const 定义的常量在内存中分配了存储空间可以获取其地址提供类型安全编译器会进行类型检查。有作用域限制遵循普通变量的作用域规则。更推荐因为具有类型信息易于维护和调试。
通常情况下推荐使用 const 修饰的变量来定义常量因为它更具类型安全性和可读性。
1.4 关键字和标识符
C中的关键字是指具有特殊含义的保留单词例如int和if
在给变量或者常量起名称时候不要用C得关键字否则会产生歧义。标识符是程序员定义的用于命名变量、函数等的名称。 给标识符命名时争取做到见名知意的效果方便自己和他人的阅读
标识符不能是关键字标识符只能由字母、数字、下划线组成第一个字符必须为字母或下划线标识符中字母区分大小写
二、数据类型
C中的数据类型可以分为 好的我会继续介绍C中常见的基本数据类型和用户定义数据类型。
2.1 基本数据类型:
检验类型大小 sizeof(数据类型、变量) C是一种静态类型语言这意味着在创建变量或常量时必须明确指定其数据类型。编译器需要在编译时确定每个变量的数据类型以便正确分配内存并执行相应的操作。
如果不指定数据类型编译器将无法正确处理变量的内存分配和操作因此必须明确定义数据类型。
2.1.1整型:
用于表示整数类型的数据可以是正数、负数或零。区别在于存储的空间大小不同 short int long long long
short2字节 -2^15 - 2 ^15 -1 int 4字节 -2^31 - 2 ^31 -1 long在32位系统上通常4字节, 在64位系统上通常8字节, -2^31 - 2 ^31 -1 long long 8字节 -2^15 - 2 ^63 -1
2.1.2 浮点型 (实数):
用于表示带有小数的数值其中float表示单精度浮点数而double表示双精度浮点数。float: float 是一种单精度浮点数数据类型通常占用4字节32位可以存储大约7位有效数字。使用 f 后缀来明确指定一个浮点数为 float 类型如 3.14f。 double: double 是一种双精度浮点数数据类型通常占用8字节64位可以存储大约15-16位有效数字。 科学计数法: C支持科学计数法来表示浮点数使用形如 aeb 的表示法其中 a 是系数e 是底数为10的指数b 是指数的符号。例如3e2 表示 (3 *10^2)即3000.03 可以写作 3e-2 表示 (3 *10^(-2))。
示例
float pi 3.14f; // 使用 f 后缀指定 float 类型
double largeNumber 1.234567890123456789; // 默认为 double 类型float a 3e2; // 表示 300
float b 3e-2; // 表示 0.03保留指定位数的小数
使用iomanip库中的setprecision函数
fixed和setprecision函数来设置输出的小数精度。fixed用于固定小数点的位置setprecision用于设置小数的位数。#include iostream
#include iomanip
using namespace std;int main() {double num 3.1415926;int precision 3; // 保留3位小数cout fixed setprecision(precision) num endl;return 0;
}字符串流stringstream#include iostream
#include sstream
#include string
#include iomanip
using namespace std;int main() {double num 3.1415926;int precision 3; // 保留3位小数stringstream ss;ss fixed setprecision(precision) num;string result ss.str();cout result endl;return 0;
}我们使用字符串流stringstream来将浮点数转换为字符串并设置小数的位数。然后我们可以将结果存储在一个字符串变量中以便后续使用。
2.1.3 字符型 (char 1个字节):
作用 用于表示单个字符以ASCII编码1为基础。
语法 char ch a;
注意 ( 1 )用单引号括起字符示例char myChar A; ( 2 )单引号内只能包含一个字符不能是字符串示例char myChar AB; 是不允许的应该是 char myChar A; ( 3 字符型变量char在C和C中通常占用1个字节8位无论是用于存储字符本身还是对应的ASCII码。
2.1.3.1转义字符
用于表示一些不能显示出来的ASCII字符
转义字符是在字符前面加上反斜杠\来表示一些特殊字符或操作通常用于在字符串或字符常量中插入不易直接输入的字符。
常用的转义字符有 \n \\ \t
2.1.4 布尔型 (bool):
布尔类型bool是一种用于表示真true或假false的数据类型在C中占用1个字节大小。它是用来做逻辑判断的基本类型。
bool flag true;cout flag endl; // 1flag false;cout flag endl; // 0cout size of bool sizeof(bool) endl; //12. 2 用户定义数据类型(后续:
结构体 (struct): 允许创建包含多个不同数据类型的组合体可以通过结构体定义多个变量来描述一个实体的属性。类 (class): 允许创建具有成员变量和成员函数的自定义数据类型实现了面向对象编程的概念包括封装、继承和多态。枚举类型 (enum): 允许创建一个包含一组命名常量的新数据类型。共用体 (union):共用体允许在同一内存位置存储不同的数据类型。这意味着共用体的成员共享内存修改一个成员会影响到其他成员。typedef 定义的类型:typedef 是用来为现有类型定义新的名称提高代码的可读性和可维护性。
2.3 字符串型
在C中字符串类型可以属于两种类型普通类型和用户定义类型具体取决于使用的字符串表示方式。 普通类型延续C语言风格: 在C中可以使用字符数组char array或指向字符的指针来表示字符串。这种方式属于普通类型没有特定的用户定义类型它们是C和C的基本字符串表示方式。 char str1[] Hello, world!; // 字符数组表示字符串
char* str2 Hello, world!; // 字针表示字符串用户定义类型: 另一方面C也提供了标准库中的 std::string 类这是一个用户定义的字符串类型。std::string 是一个类提供了丰富的字符串操作功能和方便的字符串管理。 #include stringstd::string str Hello, world!; // 使用 std::string 类型std::string 是C标准库中的一部分它提供了很多方便的字符串处理方法例如字符串拼接、查找、替换等操作使得字符串处理更方便和高效。
因此字符串可以是普通类型字符数组或指针或用户定义类型std::string具体取决于你选择的字符串表示方式。如果需要更多信息或有其他问题请随时提出。
2.4 数据键入
作用用于从键盘获取数据
关键字: cin
语法 cin 变量
cin通常与运算符一起使用用于将输入的数据存储到指定的变量中。这样可以方便地从用户那里接收输入并在程序中进行处理
int x 0;cout 请输入整型变量x的值 endl;cin x;cout x endl;三、运算符 注意1 两个小数不可做取模运算结果看左边 int a3 10;int b3 0;//报错除数不可以为0//cout a3 / b3 endl; // 两个小数不可做取模运算结果看左边// 除数不为0cout -10 % 3 endl; //-1cout 10 % 3 endl; // 1//两个小数可以相除double d1 0.5;double d2 0.25;cout d1 / d2 endl;2赋值是‘’ 等于是‘’
算术运算符 赋值运算符 比较运算符
逻辑运算符 基础二 准备工作安装MSYS2软件 创建文件 一、基本介绍1.1C源文件1.2 代码注释1.3变量与常量1.3.1变量1.3.2 常量1.3.3 二者的区别 1.4 关键字和标识符 二、数据类型2.1 基本数据类型:2.1.1整型:2.1.2 浮点型 (实数):保留指定位数的小数 2.1.3 字符型 (char 1个字节):2.1.3.1转义字符 2.1.4 布尔型 (bool): 2. 2 用户定义数据类型(后续:2.3 字符串型2.4 数据键入 三、运算符四、流程控制语句4.1 选择结构4.1.1 if语句 4.1.2 三目运算符4.1.3 switch语句注意事项 4.1.4 if和switch的区别【CHAT】4.2 循环结构4.2.1 while循环语句4.2.2 do...while循环语句 4.2.3 for循环语句九九乘法表 4.3 跳转语句4.3.1 break语句4.3.2 continue语句4.3.3 goto语句- goto关键字。 五、数组5.1 一维数组CLion中有错误cast from ‘int*’ to ‘int’ loses precision [-fpermissive]问题解决 冒泡排序C语言内置的qsort 5.2 二维数组 六、函数值传递如果想要改变实参 -- 互换地址的内容 四、流程控制语句
顺序结构、选择结构、循环结构4.1 选择结构
4.1.1 if语句
用于执行基于条件的代码块。if语句的三种形式 单行格式if语句 多行格式if语句 多条件的if语句 1.单行格式if语句if(条件){ 条件满足执行的语句 } if条件表达式后不要加分号
if (sum100){coutsum100endl;}( 2 ) .多行格式if语句
if(条件){ 条件满足执行的语句 }
else{ 条件不满足执行的语句 };( 3 ).多行格式if语句
if(条件){ 条件满足执行的语句 }
else{ 条件不满足执行的语句 };4.1.2 三目运算符
语法表达式1 ? 表达式2 表达式3 int a 10;int b 20;int c a b ? a : b;cout c c endl;4.1.3 switch语句
switch - case
每个case标签之后不会自动执行到下一个case标签除非使用break语句来显式终止switch块。
switch(表达式){case 结果1执行语句;break;case 结果2执行语句;break;...default:执行语句;break;}
举例代码
#include iostreamint main() {int choice 2;switch (choice) {case 1:std::cout 选项1 std::endl;case 2:std::cout 选项2 std::endl;case 3:std::cout 选项3 std::endl;default:std::cout 默认选项 std::endl;}return 0;
}
这是因为没有break语句来终止case标签导致控制流“直通”到后续的case标签。如果您想要避免这种行为应在每个case块的末尾使用break语句来显式退出switch块。
注意事项 switch语句中的表达式类型通常只能是整型或字符型。这是因为case标签中的常量值需要与表达式的类型匹配。 如果在case标签中没有使用break语句程序会继续执行下一个case标签这就是所谓的“直通”行为。 switch语句在处理多个条件判断时具有结构清晰和执行效率高的优点。它适用于在一系列离散值中选择执行不同的代码块。 一个switch语句的缺点是它不能直接判断区间只能针对离散的值进行判断。要处理区间通常需要使用一系列if语句或其他逻辑结构。
这些特点使switch成为一种适用于某些情况下的有效控制结构但在其他情况下可能需要使用不同的条件控制方式。
4.1.4 if和switch的区别【CHAT】
if更灵活适用于各种条件逻辑
switch更适用于多个等值条件的情况下代码更具可读性。用法 if语句适用于任何条件判断可以处理各种复杂的条件表达式包括比较、逻辑运算等。它可以用来实现灵活的条件控制。switch语句通常用于根据一个表达式的不同值来选择执行不同的代码块。它适用于多个等值条件的情况。 条件 if语句可以处理各种条件包括布尔表达式、比较表达式、逻辑表达式等可以实现更灵活的条件逻辑。switch语句通常用于处理整数或字符类型的表达式用于离散的值判断而不适用于范围或其他类型的条件。 多条件 if语句可以轻松处理多个条件通过嵌套if语句或使用else if来实现多个条件分支。switch语句通过多个case标签来处理多个等值条件通常更适用于处理相对简单的多条件情况。 可读性 switch语句通常在处理多个等值条件时更具可读性因为所有条件都集中在一起。if语句用于处理复杂的条件逻辑时可能需要更多的嵌套可读性可能较差。 执行流程 if语句是根据条件的真假来决定是否执行某个代码块。switch语句是基于表达式的值来选择执行哪个case块然后执行该块内的代码之后需要使用break语句来终止switch块否则会直通到下一个case。
综上所述选择使用if还是switch取决于您的需求。
4.2 循环结构
4.2.1 while循环语句
语法 while(循环条件){ 循环语句 }
int num 0;while (num 10){cout num num endl;num;}执行循环语句时确实必须提供跳出循环的出口否则可能会陷入死循环导致程序永远不会停止执行。以下是一些常见的方法来实现循环的退出
4.2.2 do…while循环语句
语法 do{ 循环语句 } while(循环条件); 与while的区别在于do…while会先执行一次循环语句再判断循环条件
4.2.3 for循环语句
语法 for(起始表达式;条件表达式;末尾循环体) { 循环语句; } for循环中的表达式要用分号进行分隔
九九乘法表 4.3 跳转语句
4.3.1 break语句 在switch语句中break语句用于终止当前的case标签块并跳出switch语句。这可以防止直通到下一个case标签。 在循环语句中如for、while、do-whilebreak语句用于提前跳出当前循环即使循环条件仍然满足。它用于终止循环的执行使程序流程进入循环后的下一个语句。 在嵌套循环中如果存在多个嵌套循环break语句通常跳出最近的内层循环而不是整个外层循环。这允许您有选择性地退出嵌套循环中的一个循环而不必退出所有嵌套层次。
break语句是控制流的重要工具用于在满足特定条件时改变程序的执行路径。要注意滥用break可能会导致代码难以理解和维护因此应该慎重使用。
4.3.2 continue语句
continue并没有使整个循环终止而break会跳出循环
4.3.3 goto语句- goto关键字。
语法 goto 标记;
goto语句是一种在编程中用来无条件跳转到程序中的标记label处的控制语句。goto 标记;标记是在程序中的一个标签通常是一个带有冒号的标识符例如 label:。
使用goto语句可以使程序跳转到指定标记的位置继续执行代码。这可以在某些情况下用于实现特定的控制流程但要小心使用因为滥用goto可能导致程序难以理解和维护产生不可预测的行为。
大多数现代编程语言鼓励避免使用goto并提供更结构化的控制结构如条件语句和循环以更清晰和可维护的方式实现控制流程。在实际编程中通常不需要使用goto并且可以通过其他方法来实现相同的目标。
五、数组
1数据类型相同 数组中的每个数据元素都必须是相同的数据类型。这意味着如果您创建一个整数数组每个元素都必须是整数如果是字符数组每个元素都必须是字符以此类推。
2连续内存 数组的元素在内存中是连续存储的这意味着数组中的元素在内存中相邻没有额外的空间分隔它们。这也是数组的一个重要特点因为它允许通过索引来快速访问元素索引值可用于计算元素的内存地址。
5.1 一维数组
一维数组定义的三种方式
数据类型 数组名[ 数组长度 ];数据类型 数组名[ 数组长度 ] { 值1值2 ...};数据类型 数组名[ ] { 值1值2 ...};
1. 可以统计整个数组在内存中的长度sizeof(arr) / sizeof(arr[0]) 2可以获取数组在内存中的首地址(int)arr
CLion中有错误cast from ‘int*’ to ‘int’ loses precision [-fpermissive]问题解决
该这里是因为基于Linux内核的64位系统上指针类型占用8个字节而int类型占用4个字节所以会出现loses precision。
可以先将int* 转成long类型long类型可以隐式类型转换到int类型。直接修改为long long即可
cout 数组首地址为 (long long)arr endl;
cout 数组第一个元素地址为 (long long)arr[0] endl;
cout 数组第二个地址为 (long long)arr[1] endl;冒泡排序
int main() {int arr[9] { 1,7,5,3,4,8,6,2,3};for (int i 0; i 9 - 1; i){for (int j 0; j 9 - 1 - i; j){if (arr[j] arr[j 1]){int temp arr[j];arr[j] arr[j 1];arr[j 1] temp;}}}for (int i 0; i 9; i){cout arr[i] endl;}system(pause);return 0;
}C语言内置的qsort
#include stdio.h
#include stdlib.h// 比较函数用于告诉qsort如何比较元素
int compare(const void *a, const void *b) {return (*(int *)a - *(int *)b);
}int main() {int arr[] {5, 2, 9, 1, 5, 6};int length sizeof(arr) / sizeof(arr[0]);// 使用qsort对整数数组进行升序排序qsort(arr, length, sizeof(int), compare);// 打印排序后的数组printf(排序后的数组);for (int i 0; i length; i) {printf(%d , arr[i]);}printf(\n);return 0;
}
5.2 二维数组
二维数组定义的四种方式
数据类型 数组名[ 行数 ][ 列数 ];数据类型 数组名[ 行数 ][ 列数 ] { {数据1数据2 } {数据3数据4 } };数据类型 数组名[ 行数 ][ 列数 ] { 数据1数据2数据3数据4}; 数据类型 数组名[ ][ 列数 ] { 数据1数据2数据3数据4};
六、函数
将一段经常使用的代码封装起来减少重复代码返回值类型 函数名 参数列表
{函数体语句return表达式}int add(int num1, int num2)
{//函数体语句int sum num1 num2;//return表达式return sum;
}调用 函数名参数
int add(int num1, int num2) //定义中的num1,num2称为形式参数简称形参形参列表
{int sum num1 num2;return sum;
}int add(int num1, int num2, int num3) {int sum num1 num2 num3;return sum;
}int main() {int a 10;int b 10;//调用add函数int sum add(a, b);//调用时的ab称为实际参数简称实参cout sum sum endl;int sum1 add(a, b, 10);cout sum1 sum1 endl;a 100;b 100;sum add(a, b);cout sum sum endl;system(pause);return 0;
}值传递
值传递时形参是修饰不了实参的
形参无论发生什么变化都不会影响实参
void swap(int num1, int num2)
{cout 交换前 endl;cout num1 num1 endl;cout num2 num2 endl;int temp num1;num1 num2;num2 temp;cout 交换后 endl;cout num1 num1 endl;cout num2 num2 endl;//return ; 当函数声明时候不需要返回值可以不写return
}int main() {int a 10;int b 20;swap(a, b);cout mian中的 a a endl;cout mian中的 b b endl;system(pause);return 0;
}如果想要改变实参 – 互换地址的内容
void swap(int num1, int num2)
{cout 交换前 endl;cout num1 num1 endl;cout num2 num2 endl;cout num1 num1endl;cout num2 num1endl;int temp num1;num1 num2;num2 temp;cout temptempendl;cout 交换后 endl;cout num1 num1 endl;cout num2 num2 endl;cout num1 num1endl;cout num2 num1endl;//return ; 当函数声明时候不需要返回值可以不写return
}int main() {int a 10;int b 20;swap(a, b);cout mian中的 a a endl;cout mian中的 b b endl;cout a aendl;cout b bendl;system(pause);return 0;
}ASCIIAmerican Standard Code for Information Interchange编码将每个字符映射到一个唯一的整数。例如字母 ‘a’ 对应的ASCII码是97。因此当你在C或C中创建一个字符型变量时实际上是将该字符对应的ASCII码存储在内存中。 ↩︎