学习C语言基础的第四天

87 阅读5分钟

操作符

加减乘除


#include <stdio.h>

int main() {

	int num ;

	printf("输入num的值:");

	scanf_s("%d", &num);

	printf("num加上5等于%d\n", num + 5);

	printf("num减去5等于%d\n", num - 5);

	printf("num除以5等于%.2f\n", num / 5.0);

	printf("num乘以5等于%d\n", num * 5);

	printf("num取模(取余)5等于%d", num % 5);

	return 0;
}

image.png

移位操作符

涉及2机制知识后续补充

左移操作符 <<右移操作符

位操作符

& ^ |

赋值操作符

= += -= *= /= &= ^= |= >>= <<=


#include <stdio.h>

int main() {

	int num;

	// 赋值 =
	num = 0;

	// +=
	num += 1;
	// 等价于
	num = num + 1;

	// *=
	num *= 2;
	// 等价于
	num = num * 2;

	// 其它赋值操作符同理

	return 0;
}

单目操作符

! - + & sizeof ~ -- ++ * (类型)


#include <stdio.h>

int main() {

	// 逻辑反操作 !,将原本正确的认定为错误的,将错误的认定为正确的

	int a = 1;

	if (!(a > 10)) {
		printf("a大于10");
	}
	else {
		printf("a小于10");
	}

	return 0;
}

image.png


#include <stdio.h>

int main() {

	int arr[10] = { 1 };

	// 写法1:当sizeof后面跟一个值时,可以不写括号,从这也可以看出sizeof也是一个操作符
	int length = sizeof arr;

	int length2 = sizeof(arr);

	// arr可以存储10个int,每个int占用4个字节,因此4*10=40

	printf("arr的内存大小为%d\n", length);

	printf("arr的内存大小为%d", length2);

	return 0;
}

image.png


#include <stdio.h>

int main() {

	int a = 0;

	// ++a 代表先将a+1,再将a的值(此时的值为1)赋值给a2
	int a2 = ++a;

	int b = 0;

	// b++ 代表先将b的值(初始值0)赋值给b2,然后b再加1
	int b2 = b++;

	printf("a value is %d, a2 value is %d, b value is %d, b2 value is %d", a, a2, b, b2);

	return 0;
}

image.png


#include <stdio.h>

int main() {

	// 强制将double类型的值转换为int赋值给a
	int a = (int)3.1415926;

	printf("a value is %d", a);
	return 0;
}

image.png

关系操作符

> >= < <= != ==


#include <stdio.h>

int main() {

	int num = 1;

	int num2 = 1;

	while (num > 0) {
		printf("请输入num和num2的值:");

		scanf_s("%d %d", &num, &num2);

		if (num > num2) {
			printf("num的值大于num2的值\n");
		}

		if (num >= num2) {
			printf("num的值大于或等于num2的值\n");
		}

		if (num < num2) {
			printf("num的值小于num2的值\n");
		}

		if (num <= num2) {
			printf("num的值小于或等于num2的值\n");
		}

		if (num != num2) {
			printf("num的值不等于num2的值\n");
		}

		if (num == num2) {
			printf("num的值等于num2的值\n");
		}
	}

	return 0;
}

image.png

逻辑操作符

&&逻辑与 ||逻辑或


#include <stdio.h>

int main() {

	/*
	 逻辑与就是且的元素,都要满足,比如明天开家长会,老师说你爸爸妈妈都要来,
	 这就是逻辑与,你爸爸来与你妈妈来都需要满足
	 */

	int a, b;

	printf("小明请输入爸爸,妈妈来(输入1)或不来(输入0):");

	scanf_s("%d %d", &a, &b);

	if (a == 1 && b == 1) {
		printf("满足了老师要求爸爸妈妈都来的要求\n");
	}
	else {
		printf("不满足了老师要求爸爸妈妈都来的要求\n");
	}

	/*
	逻辑或很好理解,就是或的意思,你爸爸或者你妈妈来,当然喽,爸爸妈妈都来也是可以的。
	需要注意的点,我们现实中可以老师会说爸爸或者妈妈一个人来,也有可能是	(爸爸来逻辑与妈妈不来)	逻辑或 (爸爸不来逻辑与妈妈来)
	*/

	int a2, b2;

	printf("小红请输入爸爸,妈妈来(输入1)或不来(输入0):");

	scanf_s("%d %d", &a2, &b2);

	if (a2 == 1 || b2 == 1) {
		printf("满足了老师要求爸爸或者你妈妈来的要求");
	}
	else if((a2 == 1 && b2 == 0) || (a2 == 0 && b2 == 1)){
		printf("满足了老师要求爸爸或者妈妈一个人来的要求");
	}
	else {
		printf("两个要求都不满足");
	}

	return 0;
}

image.png

条件操作符

exp1 ? exp2 : exp3

#include <stdio.h>

int getBigger(int num1, int num2) {
	return num1 > num2 ? num1 : num2;
}

int getBigger2(int num1, int num2) {

	// 可以理解有一个隐藏的变量接收了条件操作符的值

	int result;

	if (num1 > num2) {

		result = num1;

	}

	else {

		result = num2;

	}

	return result;
}

int main() {

	int num, num2;

	printf("请输入num和num2的值:");

	scanf_s("%d %d", &num, &num2);

	printf("num(%d)和num2(%d)更大的值是%d\n", num, num2, getBigger(num, num2));

	printf("num(%d)和num2(%d)更大的值是%d", num, num2, getBigger2(num, num2));

	return 0;
}
 

image.png

逗号表达式

exp1,exp2,exp3,...expN


#include <stdio.h>

int main() {

	/*
		所有的表达式会从左到右按照顺序执行,
		最后一个表达式的值将会作为表达式的值
	*/

	int a = 1;

	int b = 2;

	int c = 3;

	int d = (a + b, c + a, b + c);

	printf("a,b,c,d的值分别为%d%d%d%d", a, b, c, d);

	return 0;
}

image.png

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

[]数组下标 ()函数调用 .对象属性引用 ->

关键字

关键字就是C语言预先设定好的,已经有了其作用的名称,因此我们起常量变量命名时,不能使用这些名称,会让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

typedef

typedef顾名思义就是类型定义,这里理解成类型重命名

注意:只能对类型进行重命名


#include <stdio.h>

typedef unsigned int uint_32;

int main() {

	// num1和num2这两个变量的类型是一样的

	unsigned int num1 = 0;

	uint_32 num2 = 0;

	return 0;
}

static

static静态修饰符,主要用来修饰局部变量、全局变量、函数

  1. 修饰局部变量

每次进入test函数,a局部变量都会重新创建,执行完销毁,下一次进入test时又会重新创建,再销毁...因此a的值每次输出的值都是2。


#include <stdio.h>

// void表示函数没有返回值
void test() {
	int a = 2;
	printf("%d\n", a);
	a++;
}

int main() {

	int i = 0;

	while (i < 10)
	{
		test();
		i++;
	}

	return 0;
}

image.png

但是给test函数中的局部变量a添加一个static关键字修饰之后,此时的局部变量不会再test执行完时销毁,当下一次进入test时,a局部变量还是用的之前那个没被销毁的值,且不会重新再创建。本质上是将栈内存中的局部变量放到了静态内存区中,这里对于内存不做引申。


#include <stdio.h>

// void表示函数没有返回值
void test() {
	static int a = 2;
	printf("%d\n", a);
	a++;
}

int main() {

	int i = 0;

	while (i < 10)
	{
		test();
		i++;
	}

	return 0;
}

image.png

  1. 修饰全局变量

每个C语言文件中的全局变量是可以跨文件引入的,比如a.c文件中有一个全局变量a,此时在b.c文件中是可以引用这个全局变量a的(extern int a;)。那么就可以b.c文件修改这个值,那么此时如果我们不想我们的a.c文件中的这个全局变量不被外部文件使用修改时,则我们可以使用一个static关键字修饰,此时外部文件将拿不到变量a。

  1. 修饰函数

与修饰全局变量同理。