3.【初识C语言】(上)
💦选择与循环
无论在生活中还是工作中,我们不可避免的要做出选择甚至日复一日地重复某件事情。
“人是铁饭是钢,一顿不吃饿得慌”,确实,我们每天都要重复做的一件事,那就是吃饭。
今天吃什么呢?干锅还是汤锅?这时,我们总是要做出一个选择。
思考:我们在生活中解决问题时,似乎总是离不开选择和循环,那么计算机解决一个问题是不是也是如此呢?
下面开始介绍。
选择语句
这与我们生活中很相似!
接着我们来代码实现:
#include<stdio.h>
enum select //枚举关键
{
Play_game,//枚举出可能的情况,其实这里
Study_hard,//可有可无的,感受更直观
};
int main()
{
int My_Choice = 0;
printf("你会努力学习编程吗?请选择->(1.Study_hard or 0.Play_game)\n");
printf("请输入");
scanf("%d", &My_Choice);
if (My_Choice) //选择语句
printf("成为大牛,走向人生巅峰!");
else //选择语句
printf("碌碌无为");
return 0;
}
接着我们来做出我们的选择吧!
这里可以看到我选择了1.Study hard
,这里就在屏幕上打印出了:
成为大牛,走向人生巅峰!
我们再回到选择语句:
if(judge)
{true};
else
{false};
在if后面的()里,如果判断为真,则执行true,否则执行false。
牢记:选择语句的条件判断中,0为假,非0为真!
循环语句
有些事必须一直做,比如我们日复一日地吃饭。
那么C语言如何实现循环呢?
循环有三种:
- while语句
- for语句
- do while语句
这里我们先只看while语句
while语句相应的代码:
#include<stdio.h>
int main()
{
printf("开始学习!\n");
int study_time = 0;//学习天数
while (study_time < 5000)
{
study_time++;//重复学习
}
if(study_time>=5000)
printf("已经闭关5000天,拿到好offer");
return 0;
}
小结:while后面的()里的条件如果为真(非0)就进入循环体,为假(0)就结束循环。
💦函数
听到函数是不是很熟悉?但是此函数非彼函数。
C语言函数的定义:
dataType functionName(){
//body }
- dataType 是返回值类型,它可以是C语言中的任意数据类型,例如 int、float、char 等。
- functionName 是函数名,它是标识符的一种,命名规则和标识符相同。函数名后面的括号( )不能少。
- body 是函数体,它是函数需要执行的代码,是函数的主体部分。即使只有一个语句,函数体也要由{ }包围。
- 如果有返回值,在函数体中使用 return 语句返回。return 出来的数据的类型要和 dataType 一样。
- ()里是函数的形式参数。
来看个例子:
思考:如何利用C语言,实现一个计算两数之和的函数?
代码如下:
#include<stdio.h>
int ADD(int a, int b)
{
return a + b;
}
int main()
{
int x = 0;//初始化
int y = 0;
printf("请输入x,y\n");
scanf("%d %d", &x, &y);//输入x,y
int sum = ADD(x, y);
printf("x+y=%d\n", sum);
return 0;
}
运行结果:
在我输入2 ,4后,可以看到2+4的结果被打印在了屏幕上。
总结:数据通过参数传递到函数内部进行处理,处理完成以后再通过返回值告知函数外部,并且可以简化代码,代码复用。
💦数组
创建一个变量我们可以对其赋值并使用,但如果我们想创建许多个类型相同的变量,该怎么做呢?
如果还是一个一个地去创建,未免太过浪费时间。
思考:可不可以在内存中申请一块连续的空间,这块空间可以存放多个数据?
于是数组应运而生.
C语言中给了数组的定义:一组相同类型元素的集合
数组的定义
int arr[5]={1,2,3,4,5};//定义一个整型数组,最多放5个元素
数组的下标
C语言规定:数组的每个元素都有一个下标,下标是从0开始的。
使用下标访问数组。
注意:下标是从0开始的。
比如:
数组的使用
例:将数组arr的每一个元素打印在屏幕上。
#include<stdio.h>
int main()
{
int i= 0;
int arr[5] = { 4,6,8,10,12 };//初始化数组
for (i = 0; i < 5;i++)
{
printf("a[%d]= %d\n",i, arr[i]);//打印元素
}
return 0;
}
运行结果:
利用循环,数组的每个元素的值就被打印在屏幕上了。
💦操作符
简单介绍,后面会着重讲
算术操作符
对两个数进行运算的符号(%是取余)
+ - * / %
例:1+2
移位操作符
>> <<
移动的是二进制位
例:将1左移一位得到多少?
代码:
#include<stdio.h>
int main()
{
char a = 1 << 1;
printf("%d", a);
return 0;
}
运行结果:
结果为2,我们来分析分析:
00000001 //这是1的二进制
左移1位后:
最右边空出来一位补0
如下:
00000010 //将这个值赋值给a,也就是2
位操作符
位操作符 | 解释 |
---|---|
& | 按位与 |
| | 按位或 |
^ | 按位异或 |
例:将3和5两个数按位与得到多少?
代码:
#include<stdio.h>
int main()
{
char a = 3; //赋值
char b = 5;
char c = a & b;//将3和5按位与的结构赋值给c
printf("c=%d", c);
return 0;
}
运行结果:
c=1
这是为什么呢?
按照上面的规则分析:
3的二进制:
00000011
5的二进制:
00000101
按位与:对应二进制位置上的数字分别进行&操作,然后按原位进行排列
(1 1)->1
(1 0)->0
(0 1)->0
(0 0)->0
就得到:
00000001
即为1.
按位或和按位异或也是相似的方法。
总结:
- 按位与:只要有一个0结果就为0,否则为1。
- 按位或:只要有一个1结果就为1,否则为0。
- 按位异或:相同为0,相异为1。
赋值操作符
= += -= *= /= &= ^= |= >>= <<=
例:a+=1是怎么运算的?
#include<stdio.h>
int main()
{
int a = 1;
a += 1;
printf("a+=1后a=%d\n", a);
a += 1;
printf("a+=1后a=%d\n", a);
return 0;
}
其实 a+=1
与 a=a+1
是一样的,也就得到了上面的结果。
其他的赋值运算符也都和+=类似。
单目操作符
单目操作符:只有一个操作数。
符号 | 解释 |
---|---|
! | 逻辑反操作—>采用逻辑运算 |
- | 负值 |
+ | 正值 |
& | 取地址 |
sizeof | 操作数的类型长度(不一定是数,也可以是类型) |
~ | 对一个数的二进制按位取反 |
- - | 前置、后置- - |
++ | 前置、后置++ |
* | 间接访问操作符(解引用操作符) |
(类型) | 强制类型转换 |
关系操作符
符号 | 解释 |
---|---|
> | 比较大小 |
>= | |
< | |
<= | |
!= | 判断是否相等 |
== | |
逻辑操作符 | |
逻辑运算 | |
运算符 | 解释 |
&& | 逻辑与 |
| | | 逻辑或 |
牢记:进行逻辑运算时,只看真假。
我们知道非0为真,0为假。
与高中数学一样,”与 “必须时两个都为真,结果为真;
而 ”或“则只要其中一个为真,结果就为真。
例:求1 && 0 和 1 || 0的结果。
代码:
#include<stdio.h>
int main()
{
int a = (1 && 0);
int b = (1 || 0);
printf("a=%d,b=%d", a, b);
return 0;
}
运行结果:
与我们所想的完全一致。
条件操作符
exp1?exp2:exp3
含义:如果exp1为真,则整个表达式结果为exp2,否则为exp3。(exp是表达式)
例:max=(a>b?a:b)
逗号表达式
例:exp1,exp2,exp3,...,expN
逗号表达式也叫隔开表达式。
(exp1,exp2,exp3,...,expN)这整个表达式的结果为最后一个exp,即expN。
其他
- 下标引用
[ ]
例:a[0]=1;
- 函数调用
()
例:调用rand函数 rand();
- 结构体成员
.
结构体变量名 . 成员名
->
结构体变量指针->成员名
代码:
#include<stdio.h>
struct book //创建一个结构体类型
{
int price;
char name[20];
int number;
};
int main()
{
struct book C = { 22,"C语言",002233 };//定义一个结构体变量
struct book* pc = &C;
printf("直接通过变量访问成员:\n");
printf(" price=%d\n", C.price);//通过.操作符访问变量成员
printf(" name=%s\n", C.name);
printf(" number=%d\n", C.number);
printf("通过结构体变量的指针访问成员:\n");
printf(" price=%d\n", pc->price);//通过->操作符访问变量成员
printf(" name=%s\n", pc->name);
printf(" number=%d\n", pc->number);
return 0;
}
运行结果:
这里就简单介绍了两种访问方式,他们之间还是有一定差异,但最终的效果是一样的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)