数据类型
无符号数和有符号数
在正常编码没有明确指出时候,默认为有符号数。关键字为signed。
无符号变量输入负数会发生模数运算
#include<stdio.h>
int main(){
unsigned short f= -20;
printf("%u/n",f);
return 0;
}
标识符命名规则
1.标识符只能由数字、字母、下划线(_)组成
2.标识符不能以数字开头
3.标识符不能是关键字比如if
4.标识符区分大小写
隐式转换规则
规则一
取值范围小的,和取值范围大的计算,小范围会自动转换为大范围
int a =10;
double b =12.3;
c = a + b;
从大到小
double ,float ,long long ,long ,int , short, char
规则二
short char 类型的数据,在运算的时候先提升为int,再计算
强制类型转换
格式:目标数据类型 变量名=(目标数据类型)被强转的数据;
当大的数据类型转换为小的数据类型的时候发生强制类型转换。
运算符
自增自减运算符
- 单独使用, ++和–放在前面和后面作用一样
- 参与计算
++在后面
int a = 10;
int b = a++;
//此时的b等于10
++在前面
int a = 10;
int b = ++a;
//此时b为11
#include<stdio.h>
int main(void){
int i = 10;
int j = 5;
int k = i++ + ++i - --j - i--;//10+11-4-10
printf("%d\n", k);
/*windos系统结果为7
前缀优先于后缀,前缀统一自增、自减,再把结果拿来用
后缀统一先用,等整个表达式变量用完了再进行自增
*/
return 0;
}
#include<stdio.h>
int main(){
int a = 10;
int k1 = a++ + a++;//先用后加,加完进行下一行计算
int k2 = ++a + ++a;
int k3 = ++a + a++;
int k4 = a++ + ++a;
printf("%d\n", k1);//20
printf("%d\n", k2);//28
printf("%d\n", k3);//30
printf("%d\n", k4);//34
return 0;
}
赋值运算符
符号 | 说明 | 举例 |
---|---|---|
= | 直接赋值 | int a=10,将10赋值给a |
+= | 加后赋值 | a+=b,将a+b的值给a |
-= | 减后赋值 | a-=b,将a-b的值给a |
*= | 乘后赋值 | a*=b,将a*b的值给a |
/= | 除后赋值 | a/=b,将a/b的值给a |
%= | 取余赋值 | a%=b,将a除以b的余数给a |
关系运算符
通常是比较,比如==就是比较两个数是否相等,相等为0,不相等为1。
逻辑运算符
符号 | 作用 | 说明 |
---|---|---|
&& | 与 | 两边都为真,结果才为真 |
|| | 或 | 两边都为假,结果才为假 |
! | 非 | 取反 |
三元运算符
格式:关系表达式?表达式1:表达式2;
例如
a > b ? a : b;
//当a > b为真的时候,执行a:b的a;当a > b为假的时候,执行a:b的b式子
分支语句
if
if(判断句1){
}else if(判断句2)
{
...
}else
{
}
switch语句
格式:
switch(){
case 1:
语句1;
break;
case 2:
语句2:
break;
...
default:
语句体n;
break;
}
细节说明:
- 表达式:计算结果只能为(字符/整数)
- case:值只能是(字符/整数)的字面量,不能是变量
- case:值不允许重复
- break:表示中断,结束的意思,结束switch语句
- default:所有情况都不匹配,执行该处的内容
循环结构
for循环语句
for (初始化语句;条件判断语句;条件控制语句){
循环体;
}
求一到五的和
#include<stdio.h>
int main(void){
int sum = 0;//定义一个变量用于累加数据
for (int i = 1; i <=5; i++)
{
sum = i + sum;
}
//打印sum
printf("%d\n", sum);//15
return 0;
}
while循环
初始化语句
while(条件判断语句)
{
循环体语句
条件控制语句
}
for和while的对比
相同点:运行规则是一样的
不同点:1. for循环中,控制循环的变量,因为归属for循环的 语法结构中,在for循环结束后,就不能再次被访问到。
2. while循环中,控制循环的变量,对于while循环来 说不归属其语法结构中,在while循环结束后,该变量还 可以继续使用。
do…while循环
初始化语句;
do{
循环体语句;
条件控制语句;
}while(条件判断语句);
//先执行后判断,循环体至少执行一次
continue
#include<stdio.h>
int main(){
//跳过第三个
for(int i = 1; i <= 5; i++)
{
if(i == 3)
{
continue;
}
printf("%d\n", i);
}
}
循环嵌套
#include<stdio.h>
int main(){
//跳过第三个
for(int i = 1; i <= 5; i++)
{
for(int j = 1; j <= 5; j++)
{
printf("内循环执行%d\n", j);
}
printf("内循环结束\n");
}
printf("外循环结束\n");
return 0;
}
跳出循环语句
break
跳出循环
#include<stdio.h>
int main(){
//跳过第三个
for(int i = 1; i <= 5; i++)
{
for(int j = 1; j <= 5; j++)
{
printf("内循环执行%d\n", j);
break;//跳出内循环
}
printf("内循环结束\n");
}
printf("外循环结束\n");
return 0;
}
continue
continue跳过当前循环
#include<stdio.h>
int main(){
//跳过第三个
for(int i = 1; i <= 5; i++)
{
for(int j = 1; j <= 5; j++)
{
printf("内循环执行%d\n", j);
continue;
}
printf("内循环结束\n");
}
printf("外循环结束\n");
return 0;
}
goto
#include<stdio.h>
int main(){
//跳过第三个
for(int i = 1; i <= 5; i++)
{
for(int j = 1; j <= 5; j++)
{
printf("内循环执行%d\n", j);
goto a;
}
printf("内循环结束\n");
}
a: printf("外循环结束\n");
return 0;
}
goto跳到指定语句
函数
带有参数函数
#include<stdio.h>
void sum(int num1, int num2)//形参
{
int sum = num1 + num2;
printf("%d\n", sum);
}
int main(){
sum(30 , 40);//实参
sum(10 , 20);
return 0;
}
带有返回值函数
#include<stdio.h>
double getArea(double len, double width)
{
double area = len* width;
return area;
}
int main(){
//函数比较两个长方形面积大小
double area1 = getArea(5.3, 2.7);//调用函数,接受参数
double area1 = getArea(1.5, 0.8);
if (area1 > area2)
{
printf("1");
}
else if(area1 < area2)
{
printf("2");
}
else
{
printf("0");
}
return 0;
}
函数注意事项
- 函数不调用不执行
- 函数名不能重复
- 函数与函数之间是平级关系,不能嵌套定义
- 自定义函数写在main函数下面时候需要在上方声明函数
- return下面不能编写代码,执行不到
- 函数返回值类型为void时候,表示没有返回值,return可以省略不写,如果书写return,后面不能跟具体数据,仅仅表述接二叔函数
常见函数和其头文件
#include<math.h>
int main{
pow();
sqrt();
fabs();
}
stdio.h
printf();
scanf();
stdlib.h
malloc()
free()
calloc()
realloc()
rand()
string.h
strlen()
strcmp()
strlwr()
strupr()
strcat()
strcpy()
time.h
time()//获取当前时间
#include<stdio.h>
#include<time.h>
int main{
//time小括号中表述当前时间是否需要在其他地方进行存储
//返回值long long
//从1978年1月1日开始
long long res = time(NULL);
printf("%lld\n", res);
return 0;
}
数组
数据类型 数组名[长度]
数组初始化
定义数组时候,第一次给数组赋值。
//数据类型 数组名[长度] = {数据值,数据值...}
int arr[] = {1,2,3};//长度省略时候,数据值的个数就是数组长度。
double arr[2] = {0.0};//不知道具体的,只给一个值,剩下的值都为默认0,double是0.0,int是0
索引
- 索引就是数组的一个编号,也叫角标、下标、编号
- 特点:从0开始的,连续+1,不间断
#include<stdio.h>
int main()
{
int arr[] = {1, 2, 3, 4, 5};
//获取索引为0,2,4的元素,并求和
int num1 = arr[0];
int num2 = arr[2];
int num3 = arr[4];
int sum = num1 + num2 + num3;//1 + 3 + 5
printf("%d\n", sum);
printf("修改前:%d\n", arr[4]);
arr[4] = 10;//修改下标为4的数据
printf("修改后:%d\n", arr[4]);
return 0;
}
数组遍历
#include<stdio.h>
int main()
{
int arr[5] = {1,2,3,4,5};
//利用循环遍历数组
for (int i = 0; i <=4 ; i++)
{
printf("%d\n", arr[i]);
}
return 0;
}
数组在内存中存储方式
#include<stdio.h>
int main()
{
//获取数组的内存地址
int arr[] = {1,2,3};
printf("%p\n", &arr);//数组首地址
printf("%p\n", &arr[0]);//[]中的表示偏移量
printf("%p\n", &arr[1]);//内存角度:首地址+偏移量
printf("%p\n", &arr[2]);//
//结果:00BEF9D8
//00BEF9D8
//00BEF9DC
//00BEF9E0
//差一个int类型的长度
return 0;
}
数组注意事项
数组作为参数时候需要获取数组长度
#include<stdio.h>
void printArr(int arr[]);
int main()
{
//获取数组的内存地址
int arr[] = {1,2,3};
//数组作为函数的参数,实际上传递的是数组的首地址,如果在在函数中对数组进行遍历,一定要把数组长度一起传递过去
//定义处arr表示的就是完整的数组
//函数中的arr只是一个变量,用来记录数组的首地址
printArr(arr);
return 0;
}
void printArr(int arr[])
{
int len = sizeof(arr)/sizeof(arr[0]);
for (int i= 0; i <= len; i++)
{
printf("%d\n", arr[i]);
}
}
#include<stdio.h>
void printArr(int arr[], int len);
int main()
{
int arr[] = {1,2,3};
int len = sizeof(arr) / sizeof(int);
printArr(arr, len);
return 0;
}
void printArr(int arr[], int len)
{
for (int i= 0; i <= len; i++)
{
printf("%d\n", arr[i]);
}
}
数组练习
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
//生成10个1-100之间的随机数存入数组
//求出所有数据的和
int arr[10] = { 0 };
int len = sizeof(arr) / sizeof(int);
//生成10个1-100之间的随机数存入数组
//设置种子
//生成随机数
srand(time(NULL));//srand函数是用于生成随机数种子,决定随机数序列的起始值,用于每次生成的随机数序列不同。
for (int i = 0; i < len; i++)
{
int num = rand() % 100 + 1;
//随机数存入数组
printf("%d\n", num);
arr[i] = num;
}
//利用累加思想求和
int sum = 0;
for (int i = 0; i < len; i++)
{
sum = sum + arr[i];
}
printf("%d\n", sum);
return 0;
}
反转数组
#include<stdio.h>
void printArr(int arr[], int len);
int main()
{
int arr[5] = { 0 };
int i = 0;
int len = sizeof(arr) / sizeof(int);//长度
for (i;i<len ; i++)
{
printf("输入第%d个数\n", i+1);
scanf_s("%d", &arr[i]);//存入数组
}
printArr(arr, len);
printf("反转数组后:\n");
int j = 0;
int k = len - 1;
while (j < k)
{
int temp = 0;//临时的第三方变量,用于交换数据
temp = arr[j];//反转数组
arr[j] = arr[k];
arr[k] = temp;
j++;
k--;
}
printArr(arr, len);
return 0;
}
void printArr(int arr[],int len)
{ //函数打印数组
for (int i = 0; i<len; i++)
{
printf("%d\n", arr[i]);
}
}
数组查找
顺序查找
#include<stdio.h>
int order(int arr[], int len, int num);
int main()
{
int arr[5] = { 1,1,3,4,4 };
int i = 0;
int len = sizeof(arr) / sizeof(int);//长度
int num = 1;
//index:-1表示无匹配数据,其他数字表示索引,索引是从零开始
int index = order(arr, len, num);
printf("%d\n", index);
//缺点是数组中如果有多个相同数据时,只能返回第一个
//在函数中遇到第一个匹配值就返回index值
//终止函数继续循环
//如果想要解决,需要把索引存入数组,函数返回数组指针。
return 0;
}
int order(int arr[], int len,int num )
{
int ar[10] = { 0 };
for (int i = 0; i < len; i++)
{
if (arr[i] == num) {
//ar[i] = i;
return i;
}
}
return -1;
}
标签:arr,main,return,语言,int,笔记,学习,printf,include
From: https://blog.csdn.net/wotub/article/details/140449511