目录
一、选择语句
引言:C语言是结构化的程序设计语言
顺序结构、选择结构、循环结构
选择语句可以使用 if else
举例
#include <stdio.h>
int main()
{
int a;
if(a>0)
printf("成功\n");
else
printf("失败\n");
return 0;
}
二、循环语句
- while语句
- do.......while语句
- for语句
此处先讲解while语句,其他在后续内容会讲解。
while()语句,当满足()内的条件时,程序继续while循环,不满足时退出循环。
举例
#include<stdio.h>
int main()
{
printf("开始学习\n");
int line = 0;
while(line<=20000)
{
line++;
printf("我要继续努力敲代码\n");
}
if(line>20000) //循环可能会被其他因素打破
printf("offer\n");
return 0;
}
注意:当while循环后要执行的代码不只有一行时,需要使用{ }。
三、函数
在数学中的函数:f(x)=2*x;
在C语言中的函数与之也有相似之处,给出相应的操作数只能得出唯一的结果。
那么函数在c语言中有什么优势呢?接下来举例说明
#include<stdio.h>
int main()
{
int num1=0;
int num2=0;
int sun=0;
printf("输入两个操作数:>");
scanf("%d %d",&num1,&num2);
sum=num1+num2;
printf("sum=%d\n",sum);
return 0;
}
我们可以知道,如果上述只需要相加一次那么上面的代码显然很简单,但是如果要执行多次相加呢?由此我们可以引出函数的概念来,那么上面的代码就可以写成:
#include<stdio.h>
int Add(int x,int y)
{
int z=x+y;
return z;
}
int main()
{
int num1;
int num2;
int sum;
printf("输入两个操作数:>");
scanf("%d %d",&num1,&num2);
sum=Add(num1,num2); //调用函数
return 0;
}
那这样显然简单了,接下来我们来分析一下调用的这个函数吧!
int是返回类型,Add是函数名,int x,int y是形式参数,{ }内的是函数体。
四、数组
如果我们要存储1-10的数字,要怎么存储呢?
C语言中给出了数组的定义:一组相同类型元素的集合
4.1数组的定义
例如:
类型名+数组名+数组中元素个数
int arr[10] = {1,2,3,4,5,6,7,8,9,10}; //定义一个整型数组,最多放10个元素char ch[5] ={0}; //不完全初始化,第一个元素初始化为0,剩余的默认会初始化为0
有时候如果[ ]内没有填写数据元素的个数,C语言系统会自动补上
char ch[ ]={0}; //数组中只有一个元素
char ch2[ ] = {'a','b','c'}; //3个元素
4.2数组的下标
C语言规定:数组的每个元素都有一个下标,下标是从0开始的。
数组可以通过下标来访问。
int arr[10] = {0};
//如果数组10个元素,下标的范围是0-9.
注意:如果是下列情况
printf("%d",arr[18]); //此时arr中一个有10个元素,最后一个元素为arr[9],此时arr[18]越界访问了,错误。
4.3数组的使用
#include<stdio.h>
int main()
{
int i = 0;
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; //创建数组
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]); //访问数组元素
}
printf("\n");
return 0;
}
五、操作符
算术操作符
+ - * / %
/(除号)两端的操作数如果是整数,执行的是整数除法,至少有一个操作数是浮点数执行的才是浮点数的除法。
例:
%操作符 关注的是除法后的余数,操作符的两个操作符必须是整数。
移位操作符(移的是二进制位,之后会讲解)
>> <<
位操作符(之后讲解)
& | ^
赋值操作符
= += -= *= /= &= ^= |= >>= <<=
#include<stdio.h>
int main()
{
int a = 0; //创建变量,并初始化
a = 20; //赋值
a += 5; //等价于a=a+5
a = a * 2;
a *= 2;
return 0;
}
单目操作符
此处简单介绍单目操作符与双目操作符的区别
例如:2 + 3
左操作数 右操作数 有两个操作数就叫做双目操作符
只有一个操作数叫做单目操作符
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
!操作符
C语言中用0\1来表示真假,0表示假,非0表示真。
!操作符即逻辑反操作就是使真的变为假的,假的变为真的。
例如:若 a 为真,那么 !a 即为假。
-、+
-即取操作数的负值
+操作数的值不变
&操作符之后详细讲解
sizeof操作符
许多的初学者在学习C语言的时候都会有一个疑问那就是:sizeof到底是不是函数?
此处由我来为你们解答:sizeof不是函数,他是操作符。
在这里我将通过函数的特性来说明sizeof不是函数:
在使用sizeof来求操作数的类型长度时,sizeof(a)中的()可以省略,但是如果是函数的话函数名后面的括号是不可以省略的,因此sizeof不是一个函数。但是注意sizeof(int)如果()里面是类型名的话,是不可以省略的。
#include<stdio.h>
int main()
{
int a = -1;
printf("%d\n", sizeof(a));
printf("%d\n", sizeof(int));
printf("%d\n", sizeof a);
printf("%d\n", sizeof(int));
return 0;
}
我们可以通过sizeof知道操作数的类型长度,具体如下
其次可以用来计算数组元素的个数:
#include<stdio.h>
int main()
{
int arr[10] = { 0 };
printf("%d\n", sizeof (arr)); //40
int sz = sizeof(arr) / sizeof(arr[0]); //10
printf("%d\n", sz);
return 0;
}
插个小知识点:
- strlen是库函数,只能针对字符串,求字符串的长度,计算的是字符串中\0之前的字符个数。
- sizeof是操作符,是计算所占内存的大小。
--、++
- 前置--:先--后使用
- 后置--:先使用后--
- 前置++:先++后使用
- 后置++:先使用后++
(类型)操作符
强制类型转换例如int a=(int)3.14;
此时就把3.14(浮点型)转变为int(整型)。
关系操作符
>
>=
<
<=
!= 用于测试“不相等”
== 用于测试“相等”
此处我们着重讲解!=、==
!=、==
#include<stdio.h>
int main()
{
int a = 3;
int b = 3;
if(a!=b)
printf("hehe\n");
else if (a == b)
{
printf("haha\n");
}
return 0;
}
但是两个字符串是不能使用==来判断相等的,使用strcmp(需要引头文件string.h)
#include<stdio.h>
int main()
{
char arr1[] = "abcdef";
char arr2[] = "abcdef";
if (strcmp(arr1, arr2) == 0) //此时arr1与arr2相等
{
printf("==\n");
}
else
printf("!=\n");
return 0;
}
注意:==是相等,=是赋值。
逻辑操作符(关注真假)
&& 逻辑与--并且
|| 逻辑或--或者
#include<stdio.h>
int main()
{
int a = 3;
int b = 5;
int c = a && b;
printf("%d\n", c);
return 0;
}
&& 如果a,b两个数中有一个数是假(0)那么a&&b为0
||如果a,b两个数中有一个数为真(1)那么a||b为1
条件操作符(三目操作符)
exp1?exp2:exp3;
此表达式的意思为:
如果exp1为真,表达式2(exp2)的结果为整个表达式的结果
如果exp1为假,表达式3(exp3)的结果为整个表达式的结果
#include<stdio.h>
int main()
{
int a = 10;
int b = 0;
if (a > 5)
b = 3;
else
b = -3;
//可以等价为b=(a>5?3:-3);
return 0;
}
逗号表达式(逗号隔开的一串表达式)
exp1,exp2,exp3.......expN
逗号表达式的特点:
从左到右依次计算,整个表达式的结果是最后一个表达式的结果
#include<stdio.h>
int main()
{
int b = 5;
int c = 0;
int d(a += 2, b = b - c + a, c = a + b);
//a=5 b=10 c=15
printf("%d\n", d);
return 0;
}
下标引用、函数调用和结构成员
[ ] ( ) . ->
#include<stdio.h>
int main()
{
int arr[10] = { 0 }; //创建一个数组,下标是0-9
arr[4] = 5;
//下标引用操作符
//arr 、 4是[]的两个操作数
return 0;
}
#include<stdio.h>
int Add()
{
return x + y;
}
int main()
{
int c = Add(2, 3); //()是函数调用操作符 操作数是Add,2,3
printf("c=%d\n", c);
return 0;
}
六、常见关键字
C语言提供了丰富的关键字,这些关键字都是语言本身预先设计好的,用户是不能自己创建关键字的。
auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while
auto ----- 创建自动变量的
局部变量都是自动创建自动销毁的,所有的局部变量都是auto修饰的,因为局部变量都有auto,所以auto自动省略了。
#include<stdio.h>
int main()
{
auto int a = 10;
return 0;
}
enum (枚举类型关键字)
extern 是用来声明外部符号的
register -----寄存器变量
在计算机中数据可以存放在哪里呢?
1.内存 2.硬盘 3.高速缓存 4.寄存器
因为寄存器中元素更加快速,所以我们就希望自己创建的变量放在寄存器中
#include<stdio.h>
int main()
{
//建议把10放在寄存器中,最终是否放在寄存器中取决于编译器
register int a = 10;
//速度更快
return 0;
}
但是现在的寄存器已经足够聪明,即使不写register,如果编译器认为有必要把他放在寄存器中,也会把他放在寄存器中。
static -----静态的
在C语言中:
static是用来修饰变量和函数的
- 修饰局部变量-称为静态局部变量
- 修饰全局变量-称为静态全局变量
- 修饰函数-称为静态函数
-
修饰局部变量
我们可以对比一下两个代码中第二个代码中局部变量前面加了static导致了最终的运行结果不同,那这是为什么呢?
首先我们要明白在内存中存储区域有栈区、堆区、静态区。
在栈区上创建的变量都被称为临时变量,在静态区创建的变量进入范围内存在离开时也不销毁,直到整个结束,要注意在静态区存储的变量是可以改变的。
那我们来解释一下上述代码吧!
在第一个代码中,局部变量int =3前面并没有加static,说明他是在栈区存储,在进入局部变量的作用域内时生命周期开始,出了作用域自动销毁。
而第二个代码中,加了static,那么这个变量将在静态区里面存储,此时他的生命周期就延长了直到整个程序完成。
那么我们来总结一下吧!
普通的局部变量是放在内存的栈区上的,进入局部范围,变量创建,除了局部范围,变量销毁。
当static修饰局部变量的时候,局部变量是在静态区开辟的,这时的局部变量出了作用域,变量不销毁,下次进去作用域,使用的是上一次遗留的数据。(改变了存储位置,由栈区变为静态区,使得变量的生命周期发生了变化)。
修饰全局变量
一个全局变量在其他的文件定义在本文件里面也可以使用。
对比以上两个代码,我们发现当全局变量前面加上static的时候,代码无法运行,那这又是为什么呢?
全局变量是有外部链接属性的,如果全局变量被static修饰,外部链接属性就变成了内部链接属性,本工程中其他的源文件无法再通过链接找到这个变量。static修饰的全局变量只能在自己所在的.c文件里面使用。
修饰函数
static修饰函数时和修饰全局变量相似。
函数是具有外部链接属性的,其它源文件想要使用函数,只需要正确的声明就可以了。
但是函数被static修饰就由外部链接属性变为了内部连接属性,这个时间函数只能在自己所在的.c文件内部使用,不能在外部使用。
外部链接属性--------------全局变量,函数
内部链接属性--------------static修饰的全局变量,函数
无链接属性 ---------------局部变量
关键字typedef
typedef顾名思义是类型定义,可以理解为类型重命名。
例如
#include<stdio.h>
typedef int ll;
ll main()
{
ll i = 0;
printf("%d\n",i);
return 0;
}
上述即为把int类型重命名为ll。
好了今天的内容先分享到这里,希望大家多多关注!
后续内容在本账号敬请期待!