0
点赞
收藏
分享

微信扫一扫

初识C语言(三)

小磊z 2022-04-14 阅读 98
c语言c++

一.操作符

首先我们一起来看C语言中所需要用的全部操作符,然后我会挑选部分操作符进行讲解。

算术操作符

移位操作符

位操作符

赋值操作符

单目操作符

关系操作符

逻辑操作符

条件操作符

逗号表达式

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

/  % 

/ 为除法运算,而%为取余操作,其中/ 左右都为整数时则结果仅输出商的部分,舍弃余数;

/ 两边均为整数3 2,所以此时取商为1,取余为1。 

当/ 两边有一边为浮点数时则结果为浮点数;

 此时结果为1.500000为浮点数,注意输出格式要改成浮点数输出格式如%f或者%lf等。

+=  -=

+=与-=用法相似,如a+=3等价于a=a+3,a-=3等价于a=a-3;

 !

!为逻辑反操作,一般用于判断条件,示例如下:

 我们都知道C语言中0为假,非0为真,我们定义的flag为1为真,!flag则为取反为假,此时程序不会进入if语句中,则什么也不会输出;

当我们把定义的flag变量改为0时,此时就会输出hehe;这就是!的主要应用。

- +

-就是取负号,但+不一定是取正,示例如下:

 定义的变量b为10,-b取其相反数,所以输出结果为-10,那大多数同学认为如果定义变量b为-10,那么+a是不是就会输出10呢?其实不然,示例如下:

 

我们可以看见输出结果依旧是-10,这是C语言的固定,我们不必深究,只需记住-是取反的操作就可以了。

&

&我们已经并不陌生,就是取地址,一般用于scanf函数的输入,也可以用于求一个变量的地址,示例如下:

 这就是变量的地址。

 ++ --

该类型操作符分为前置和后置,我们拿++举例,前置++说明变量先自增1再使用变量,后置++说明先使用变量之后再使变量自增1,示例如下:

前置++:

 这里先使用变量a赋值给b,再使a自增1,所以输出结果为a=11,b=10;

后置++:

这里先使变量a自增1,再将自增后的结果赋值给b,所以输出结果为a=11,b=11;

&& ||

该类型操作符为逻辑判断操作符,&&表示操作符两边全为真则可执行程序,||则表示有一边为真就可以执行程序了,示例如下:

 

 第一个if语句中&&操作符左右两边均为非0为真,故可进入if语句中执行程序;

第二个if语句中&&操作符左右两边有一个为0,故不可进入if语句中执行程序;

第三个if语句中||操作符左右两边有一个非0为真,故可进入if语句中执行程序。

exp1 ? exp2 : exp3  

这个操作符的意思时exp1的结果为真则执行exp2,否则执行exp3,示例如下:

 我们可以看到我定义了变量a=5,b=3,c来存储计算后的结果,若a>b,则输出a,否则输出b,此时a=5>b=3,故输出结果为a(c=5)。

exp1, exp2, exp3 .......expn 

该表达式的特点就是前面每一个表达式的结果可参与后面表达式的计算,输出结果为最后一个表达式的如果,示例如下:

 第一个表达式算出c=7,第二个表达式算出a=10,第三个表达式c-3=7-3=4,故输出结果为4。

剩余操作符我们在后面的学习中遇到了再进行讲解!!!


关键字

常见关键字

这里我们主要讲解两个typedef和static 

typedef

typedef是类型定义,这里应该理解为类型重命名,一般用于定义结构体和单链表的结点中,示例如下:

结构体中的应用:

 这个结构体包含一个学生的学号,性别,姓名,我们用typedef将struct stu重新命名为stu;

单链表中的应用:

 这个结点包括结点的数据以及指向下一个结点的指针域,我们用typedef将struct node重新命名为node;以上两种方法应用都是为了再以后访问结构体的变量成员时更加方便。

static

(1)static修饰局部变量

示例:

void test()
{
	int a = 2;
	a++;
	printf("%d ", a);
}
int main()
{
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		test();
	}
	return 0;
}

该工程用一个for循环调用了10次test函数,在test函数中定义一个局部变量a=2,然后a++,由于局部变量的生命周期是进入作用域时创建出作用域时销毁,故每一次调用test函数时a都会重新定义为2,所以输出结果为10个2,那我们用static定义变量时会有说明不同呢?

void test()
{
	static int a = 2;
	a++;
	printf("%d ", a);
}
int main()
{
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		test();
	}
	return 0;
}

此时输出结果为3-12,这是因为用static修饰局部变量时会改变局部变量的存储位置,计算机内存分为栈区,堆区,静态区,定义的局部变量都会存储在战栈区,栈区的特点就是进入作用域创建变量,出了作用域自动销毁,而用static修饰局部变量时,变量就会存储在静态区,此时变量a的生命周期会变长(即变成整个工程的生命周期),每次出test函数时a并不会自动销毁,每次调用test函数时a会保留上一次调用完test函数之后的值,故输出结果为3-12。

(2)static修饰全局变量

当我们定义的全局变量和主函数不在一个源文件,我们使用全局变量时需要进行外部符号extern声明,示例如下:

 此时用extern进行声明时,输出结果为2022;那全局变量用static进行修饰时,结果又是怎样呢?

 此时编译会产生错误,这是因为static修饰全局变量时,变量的外部链接属性会被改变成内部链接属性,其他源文件就不能在使用这个全局变量了,宏观上给了我们一种作用域变小的感觉。

(3)static修饰函数

当我们定义的函数和主函数不在一个源文件,我们调用函数时同样需要进行外部符号extern声明,示例如下:

  此时用extern进行声明时,输出结果为30;那全局变量用static进行修饰时,结果又是怎样呢?

 

  此时编译会产生错误,同static修饰全局变量一样,这是因为static修饰函数时,函数的外部链接属性会被改变成内部链接属性,其他源文件就不能在使用这个函数了,宏观上给了我们一种作用域变小的感觉。

#define 定义常量和宏

(1)define定义常量

有的时候,我们在写程序需要反复用到一个变量时,为了避免麻烦,我们可以直接用define定义一个标识符常量,示例如下:

 (2)define定义宏

我们用define定义一个函数,示例如下:

这样用define定义了一个宏之后,我们可以多次进行两个整数相加减的操作了。

指针 

我们都知道当我们定义一个整型变量时,如int a = 10,内存会自动开辟一片空间来存储这个变量,其中这个开辟的空间在内存中有其相应的地址,我们把这个地址称为指针,指针所指向的空间就是变量的地址,通过地址我们就可以知道所存储的变量了,一定要注意这个逻辑,所以我们可以通俗的理解成指针=地址;

那我们怎么定义一个指针变量呢?指针变量的书写又是怎样呢?

比如:int a = 10;int* p = &a;

这个用p来存储a的地址,*告诉我们的是p为一个指针,int说明该指针所指向的类型是一个整型变量;

类似的:char ch = ‘a';char* pc = &ch;

这个是用pc来存储’a'的地址,*告诉我们的是pc是一个指针,char说明该指针所指向的类型是一个char型的变量;

指针变量的大小

我们可以看到不管指针类型是怎样的,其大小都是8个字节,所以我们也要记住指针变量的大小都是一样的,但是在不同的机器下可能所编译的结果不一样,在64位机器下是8个字节,32位机器下又是4个字节了。 

解引用操作

解引用操作就是读取该指针下所存储的变量,结果位变量值,采用*这个操作符,示例如下:

 通过编译我们可以发现解引用p会读取到a的变量值,令*p=20就会改变p所指向地址里面变量a的值,故输出结果为20。

结构体

结构体是 C 语言中特别重要的知识点,结构体使得 C 语言有能力描述复杂类型, 比如描述学生,学生包含: 名字 + 年龄 + 性别 + 学号 这几项信息。,这里只能使用结构体来描述了,示例如下:

struct stu
{
	char name[20];//名字
	int age;      //年龄
	char sex[5];  //性别
	char id[15]; //学号
};

如何初始化结构体?

拿上面这个学生的结构体来举例,我们需要用结构体类型定义一个变量并分别对结构体内的所有成员进行初始化,如:struct Stu s = {"张三", 20, "男", "20180101“},注意结构体的初始化必须用大括号;

如何访问结构体成员?

有两个方法,分别用到操作符 . 和->;

. 操作符

printf("name = %s age = %d sex = %s id = %s\n", s.name, s.age, s.sex, s.id);

->操作符

struct Stu *ps = &s;

printf("name = %s age = %d sex = %s id = %s\n,ps->name, ps->age, ps->sex, ps->id);

 注意:1.结构体所访问的变量成员在打印时要前后一一对应;

            2.在用->操作符访问结构体成员时,需要定义一个指针变量存储地址,用指针来访问该地                   址下的结构体成员。

示例如下:

struct stu
{
	char name[20];
	int age;
	char sex[5];
	char id[10];
};

int main()
{
	struct stu s = { "zhangsan",18,"nan","12345" };
	printf("%s %d %s %s\n", s.name, s.age, s.sex, s.id);   //用.操作符
	struct stu* p = &s;
	printf("%s %d %s %s\n", p->name, p->age, p->sex, p->id); //用->操作符
	return 0;
}

通过编译结果发现,两种访问结构体成员的输出结果相同。




到这里初识C语言的内容已经全部讲解完毕,后面我会陆续对每一章节再进行深入讲解,大家一起加油,感谢关注+点赞!!! 

 

举报

相关推荐

0 条评论