初识c语言(二)


前言

经过初识c语言(一)过后,我们对c都有了初步认识。但这呢远远不够,今天这篇文章才是c入门的重头菜。学习完今天这篇文章,我们可以说是,c入了个门。今天的文章呢,主要讲述了分支和循环语句操作符,关键字,数组,指针等重要内容。


一、分支和循环语句

1.分支语句

分支语句就是选择结构,如果…就…,否则…

if语句

格式如下:(写的是全面的那种,如果最后可能结果有一种可能情况可以使用if就可以,如果有两种,则需要使用if,else搭配起来,如果两种以上结果,则需要使用if,else if else搭配起来)
if(true){
}
else if(true){
}
else{
}
注意:1.c中非零的数表示为true,0表示为false
2.else与离它最近的if匹配;
例:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main() {
	int n;
	scanf("%d", &n);
	if (n == 1) {
		printf("你成功了!!!\n");
	}
	else if (n==0)
	{
		printf("坚持,你就差一点就成功了\n");
	}
	else
	{
		printf("不要偷懒呦!差的有点多!!\n");
	}
	return 0;
}

在这里插入图片描述

switch语句

这里只需要了解分支语句中还有switch语句即可,关于switch语句具体用法在后续笔记中详细叙说。

2. 循环语句

日常生活中我们会有好多事情日复一日的去做,比方在学校的我们,每天四点一线,教室,宿舍,餐厅,厕所,甚至有许多动作可能几乎一模一样,但在c中为了不将不必要的内存浪费,所以缩减了代码,将相同或者反复使用的代码放在循环里面。减少了代码行数,也减少了不必要的浪费。

while循环

在循环这个模块我们暂时只探索while循环,比较好理解它的代码执行过程,剩下两种循环我们后面在了解。
格式:
(当括号的条件为真的时候,就会执行{}里面的语句,执行完后,会回到括号内继续判断是否仍然为真,如果仍然为真的,则继续执行,直到条件不满足了才结束循环)

while(true){
}

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main() {
	int i = 0;
	int sum = 0;
	while (i < 5) {
		sum += i;
		i++;
	}
	printf("%d\n", sum);
	return 0;
}

在这里插入图片描述

for循环

在这里for循环也只了解有这样的循环格式就行,深的了解,后面我们探索

do while循环

同样是的哟!!

二、函数

这个也是为了简化代码的,但这个更灵活并且更方便,比如求多个数的和,应用到循环就节省了代码,但求多少个数的和,你并不知道,这就又涉及到部分代码细节你需要更改,这就造成了不必要的麻烦,所以为了简单,引入了函数概念,把一定功能的相关代码放到函数里,到时候用到的时候传个参就可以。
格式:

1.有返回类型的

返回类型 函数名(传的参数类型 起的名字){
return …(可有可无,根据自己需要来)
}
eg:
int hanshu(int n){

}

2.没有返回类型的

这个与上面那个不同就是没有返回类型,用void表示,没有return 语句。
void hanshu2(int n){
}

三、数组

用于存放相同类型的数据

1.定义

定义数组:类型 变量名 [] eg:int arr[]
[ ]中可以定义数组长度,分为两种情况,你自己给定一个值,另一种情况没有给值,空着,具体长度根据后面元素个数确定。
eg:int arr[5]={0,1,2,3,4};
int arr[ ]={0,1,2,3,4}两个长度相同。

2.初始化

完全初始化

int arr[]={1,2,3,4,5,6,4,8,7}

不完全初始化

int arr1[]={1}
只给相关位置元素初始化,其余没有的则默认为0

3.数组下标

数组的下标是从0开始的,依次加一的,访问数组,即可通过下标。
eg:arr[10]----->对应的为第11个元素。

4.扩充知识点

1.在定义的时候,[ ]里面不可以放变量,否则会报错,在访问的时候可以放变量。
eg:
定义:
int n=10;
int arr[n]={0}; //这种是错误的,定义的时候[ ]里面只可以放常量
访问:

int i=0;
int arr[4]={1,2,3,4};
while(i<5){
printf("%d\n",arr[i]);//这就是放的变量,但他是访问!!!
i++;
}

2.数组存储字符串的时候,存放的为他们的ascall码值。

四、操作符

1.算术操作符

即为:+,-,*,/,%
在这里需要注意/和%
/:如果两边都是整数,执行的最后结果为整数,如果/两边至少有一个为小数形式,则最后结果为小数。
%:这个符号为取余符号,关注的为余数,而且最后结果也为余数,所以,要求%两边须为整数形式。

2.移位操作符

‘>>‘和’<<’
'>>'表示右移
'<<'表示左移
在计算机内存储的为二进制形式,所以移动为在二进制基础上移动的。
a>>1表示a右移了1位。

3. 位操作符

也是在二进制基础上变换的
有&,|,^三中符号
&即为与,与数学上的差不多,A&B,a,b同时为真的时候,结果才为真,否则为假。有时候取地址的时候也用它。
|即为或,A|B至少有一个为真的时候最后结果为真。
^为按位异或

4.赋值操作符

=
也为复合操作符的为:
+= -= *= /= &= ^= |= >>= <<=

5.单目操作符

双目操作符的意思就是有两个操作数。eg:A+b;+左右有两个操作数,为双目操作符。
通过双目的举例,现在肯定对单目也了解了吧。
在这里插入图片描述
这里要注意sizeof为一个操作符,而不是函数,是操作符不是函数,是操作符不是函数(重要的事情说三遍!!!)

注意区分sizeof和strlen()函数

sizeof

用于计算所占内存的大小。
如果sizeof后面计算变量的大小,则写法有两种,eg:int a; sizeof(a);sizeof a;
如果sizeof后面计算的为类型大小,则写法只有一种,eg:sizeof(int);
c中sizeof的计算结构是无符号数的,对应的打印格式是%zu.

strlen()函数

为库函数,只针对字符串使用,求字符串的长度,用来求字符串中\0前面的字符个数。

++,–注意事项

++,–这个有些地方会经常涉及到这块知识点,它并不难,但很容易把人绕晕,++和–同理,这里我就只详细介绍++

a++

先进行别的操作再自加

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main() {
	int a = 1;
	int b = a++;//这里++在a后面,然后,a需要先进行别的操作,完成后再自增,此时,a先赋值给b,此时b值为1
	//赋值完成后,a自增,即a变为2.所以最后打印出如下结果
	printf("%d\n", a);
	printf("%d\n", b);
	return 0;
}

在这里插入图片描述

++a

先自增再进行别的操作

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main() {
	int a = 1;
	int b = ++a;//此时a先自增,然后a的值变为2,再赋值给b
	printf("%d\n", a);
	printf("%d\n", b);
	return 0;
}

在这里插入图片描述

6.关系操作符

=
<
<=
!=
==

注意==一般用于判断整型和字符类型的是否相等。字符串的不用 这个来判断是否相等

补充:

字符串比较是否相等使用库函数strcmp()函数,如果相等最后返回0
但使用前需要引入头文件#include<string.h>

7.逻辑操作符

&&和||

8.条件操作符

x?y:z(也叫做三目运算符)
如果x为真,则结果为y,如果为假,结果为z

9.逗号表达式

x,y,z,s用逗号分隔开来

10.下标引用、函数调用和结构成员

[] ()
. ->涉及到结构体那

五、关键字

1.常见的关键字

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
关键字是c创建的,自己不能创建,是可以直接拿来就使用的!!

2.auto关键字

创建自动变量的
这里需要注意局部变量都是自动创建自动销毁的,所以局部变量都是被auto修饰的,但一般不写auto,因为局部变量都是自动的,所以为了简化代码不写auto

3.break关键字

一般循环中会用到,在case中也会用到

4.const

修饰变量和指针

5.default

表示默认选项,一般用于switch中

6.自定义类型中涉及的关键字

enum----->枚举类型
struct------>结构体
union------->联合体,共用体

7.extern

extern是用来声明外部信号的

8.register

register是一个寄存器关键字

9.return

return一般用于函数返回

10. 关于符号的

signed有符号的
unsigned无符号的

11.typedef

类型重命名(给类型起个别名)

typedef int zz
int a=32;
zz b=a;

12.static

static是用来修饰变量和函数的

  1. 修饰局部变量-称为静态局部变量
  2. 修饰全局变量-称为静态全局变量
  3. 修饰函数-称为静态函数

补充

a.堆区:动态内存开辟在堆区:
malloc,calloc,realloc,free
b.栈区放局部变量,函数的形式参数
c.静态区里放静态变量,全局变量(数据可以修改)

修饰局部变量

普通的局部变量是放在内存的栈区(临时的)上的,进入局部范围,变量创建,出了局部变量销毁
当static修饰局部变量时,局部变量实在静态区开辟的,这时的局部变量,出了作用域变量不销毁,下次进去作用域,使用的是上一次遗留的数据(改变了存储位置,由栈区---->静态区,使得变量的生命周期发生了变化)静态区:(程序结束销毁)

修饰全局变量

全局变量具有外部链接属性
如果全局变量被static修饰,这个外部链接属性就变成了内部链接属性,其他源文件没法通过链接找到这个符号
一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使
用。

修饰函数

函数是具有外部链接属性的,其他源文件想使用函数,只需要正确声明就可以,但是函数被static修饰,外部链接属性就变成了内部连接属性,这个时候函数就只能在自己所在的.c文件内部使用,不能再外部使用。

//外部声明函数:
extern int Add(int,int)
//或者
extern int Add(int x,int y)

六、define定义常量和宏

1.定义常量

#define Max 1000

2.定义宏

#define ADD(x, y) ((x)+(y))
#include <stdio.h>
int main()
{
    int sum = ADD(2, 3);
    printf("sum = %d\n", sum);
    
    sum = 10*ADD(2, 3);
    printf("sum = %d\n", sum);
    
    return 0; }

注意:宏参数无类型限制,#define预处理指令,宏的参数是替换进去,不是传参。

七、指针

变量是创建内存中的(在内存中分配空间的),每个内存单元都有地址,所以变量也是有地址的。每个字节都有地址(变量大小取决于其数据类型大小)

1.取地址

取变量地址:& 变量名(取得地址为首字节的地址(最小的那个))(一个字节一个地址)
在这里插入图片描述eg:int num;(四个字节)
&num----->取出的为最小的地址
在这里插入图片描述

2.指针类型

上面取出的地址得放起来,放在什么地方呢,这就引出了指针这个类型
eg:int *p=& num;
int 为整型指针类型
char
用于存放字符变量的地址

3. *的详解

int *表示整型指针类型
其后面定义的变量存放地址
int num=10;
int *p=& num;
p此时表示的num的地址
*解引用操作符,*pa就是通过pa中存放的地址,找到pa指向的空间:
*p=20;

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main() {
	int num = 10;
	int* p = &num;
	*p = 20;
	printf("%d\n", num);
	return 0;
}

在这里插入图片描述

4.指针类型的大小

指针变量大小取决于存储一个地址需要多大空间(取决于计算机)
32位计算机,则内存位4B
64位计算机,则内存位数8B
X86对应32位环境
X64对应64位环境

八、结构体

c语言提供了:结构体来描述复杂对象
struct Tag{
成员列表;
};
例子:
struct stu{
char sto[20];
char name[20];
int age;
}

1.初始化

struct stu s={‘1’,‘tt’,18};

2.结构成员访问操作符 .

printf(“sto = %s name = %s age = %s\n”, s.sto, s.name,s.age);

3.->操作符

结构体指针->结构体成员
struct Stu *ps = &s;
printf(“sto = %s name = %s age = %s\n”, ps->sto, ps->name,ps->age);

总结

本文涉及内容比较多,但也是基础表面的,与初识c(一)合起来把c的大概内容简简单单过了一遍,如果全部都懂呢,证明很棒呦,如果不懂,没有关系,后续会有详细解释的,现在先把大概了解一下,有个印象。这篇文章重点难点较多,所以很多地方需要深思熟虑,如果小伙伴们有不懂的地方,可以来找我呦,咱们一起探讨!!

  • 13
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 23
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值