C语言学习笔记(五)—— 运算符、表达式和语句

一、运算符

1、赋值运算符:=

        赋值表达式的目的是把值存储到内存位置上,用于储存值的数据区域统称为数据对象,使用变量名是标识对象的一种方法。对象指的是实际的数据存储,左值是用于标识和定位存储位置的标签,右值指的是能赋值给可修改左值的量。

void example1() {
	int i;
	i = 100; //将右边的数值100赋值给左边的变量
}

2、加减乘除运算符

void example2() {
	int i = 5, j = 3;
	printf("%d\n", i + j);//8
	printf("%d\n", i - j);//2
	printf("%d\n", i * j);//15
	printf("%d\n", i / j);//1 取模
	printf("%d\n", i % j);//2 取余
	printf("%d\n", -i + j);//-2 符号运算符
}

3、sizeof运算符和size_t类型

        sizeof运算符以字节为单位返回运算对象的大小,sizeof返回size_t类型的值,它是一个无符号整数。C语言中有一个typedef机制,它允许为现有类型创建别名,如下:

void example3() {
	double typedef haha; //为double创建一个haha的别名
	haha h = 20; //使用haha来声明一个变量并赋值
	printf("%f\n", h); //20.000000

	size_t t = sizeof(int);//size_t就是个无符号整数类型的别名
	printf("%u\n", t);//4个字节
}

4、递增和递减运算符

++出现在作用的变量前面被称为前缀模式,这种模式是变量先自增再参与其他运算(先自增再使用)

++出现在作用的变量后面被称为后缀模式,这种模式是变量先参与其他运算再自增(先使用再自增)

void example4() {
	int a = 2, b = 2;
	int prefix, suffix;
	prefix = 10 * ++a; //prefix=30,a先自增再与10相乘,然后将结果赋值给prefix
	suffix = 10 * b++; //suffix=20,b先与10相乘并赋值给suffix,然后b再自增
	printf("prefix = %d ***** suffix = %d", prefix, suffix);//prefix = 30 ***** suffix = 20
}

递减运算符的运算规则同递增相同,只需要将++替换成--即可

二、表达式和语句

1、表达式

        表达式是由运算符和运算对象组成,运算对象可以是常量、变量或二者的结合。一些表达式由子表达式组成。每个表达式都有一个值,要获得这个值,必须根据运算符优先级规定的顺序来执行操作。

void example5() {
	//一些常见的表达式,表达式都有一个值
	int i;
	i = -4 + 6;
	printf("%d\n", i); //2
	int j = 6;
	i = ++j;
	printf("%d\n", i); //7
	int a;
	i = a = 2 + 5;
	printf("%d\n", i); //7
	i = 5 > 3;
	printf("%d\n", i); //1
	i = 6 + (a = 2 + 3);
	printf("%d\n", i); //11
}

2、语句

        语句是C程序的基本构建块,一条语句相当于一条完整的计算机指令,大部分语句都以 ; 结尾。

void example6() {
	int num; //这只是声明,不是表达式语句。声明创建了名称和类型,并为其分配内存位置
	//num = 5 //它只是一个表达式
	num = 5; //这是一个语句

	//下面是一个简单的循环语句(迭代语句)
	int a = 0;
	while (++num < 10)
		a += num;
	printf("%d", a); //0+6+7+8+9=30
}

三、类型转换与强制类型转换

1、类型转换

① 当类型转换出现在表达式时,无论是unsigned还是signed的char和short都会被自动转换成int,如有必要会被转换成unsigned int;

② 涉及两种类型的运算,两个值会被分别转换成两种类型的更高级别;

③ 类型的级别从高到低依次是:long double、double、float、unsigned long long、long long、unsigned long 、long、unsigned int、int,当long和int的大小相同时,unsigned int比long的级别高;

④ 在赋值表达式语句中,计算的最终结果会被转换成被赋值变量的类型,这个过程可能会导致类型升级或降级;

⑤ 当作为函数参数传递时,char和short被转换成int,float被转换成double

2、待赋值的值与目标类型不匹配时

① 目标类型是无符号整型,且待赋的值是整数时,额外的位将被忽略;

② 目标类型是一个有符号整型,且待赋的值是整数,结果因实现而异;

③ 目标类型是一个整型,且待赋的值是浮点数,该行为是未定义的;

3、强制类型转换

        在某个变量的前面放置用圆括号括起来的类型名,该类型名即是希望转换成的目标类型,圆括号和它括起来的类型名构成了强制类型转换运算符。

四、带参数的函数

void example7();
int main(void) { //使用void关键字表明此函数不接受任何参数
	example7(10);//函数调用传递的值为实际参数,这里函数调用把实际值10传递给函数
	return 0;
}

void example7(int n) {//声明参数,创建形式参数的变量,表明此函数接受一个int类型的参数
	printf("%d", n + 10);//20
}

五、关系运算符与真假值

1、常见的关系运算符

小于:<    小于或等于:<=    等于:==    大于或等于:>=    大于:>    不等于:!=

2、真假值

对于C而言,表达式为真的值是1,表达式为假的值是0

void example8() {
	int a, b;
	a = (10 > 2);
	printf("%d\n", a);//1
	b = (10 < 2);
	printf("%d\n", b);//0
}

3、_Bool类型

        _Bool类型的值只能存储1(真)和0(假),如果把其他非零的数值赋给_Bool类型的变量,该变量会被设置为1,这反映了C语言把所有非零的值都视为真。

void example9() {
	_Bool b;
	b = 3;
	printf("%d\n", b);	//1
	b = -1;
	printf("%d\n", b);	//1
	b = 0;
	printf("%d\n", b);	//0

	int i = 5, j = 0;
	while (i -= 1) {//i=i-1,当i为0时终止循环
		j += i;//j=j+i
	}
	printf("%d", j);//4+3+2+1=10
}

六、其他赋值运算符

+=    例:i +=j,就是i = i + j,如果i = 1,j = 2,则i +=j 运算结果是i = 3

-=  *=  /=  %= 等运算符与+=一致

你可能感兴趣的:(C,Primer,Plus)