13-操作符(初识)

课前小技巧:VS中,想要复制哪一行,直接把鼠标放在哪一行,Ctrl+C即可,Ctrl+V直接自动复制到下一行

C语言非常灵活:C语言提供了非常丰富的操作符,使用起来比较灵活

13-1 算术操作符

+  -  *  /  %

这里主要讲解除法符合(/)和取模(%)

计算7/2:

int main()
{
	int a = 7/2;  //除法 关注商
	int b = 7%2;  //取模 关注余数
	printf("%d\n",a);
	printf("%d\n",b);
	return 0;

结果如下:

大家可能会疑惑:除法结果为什么不是3.5呢?

那是因为,除号的两端都是整数的时候,执行的是整数除法;如果两端只要有一个浮点数(当然两个都是也可以),执行的就是浮点数的除法

如果你想得到3.5的结果:

int main()
{
	float a = 7/2.0;  //将整数2改为浮点数2.0
	printf("%f\n",a);  //打印浮点数用%f
	return 0;
}

结果如下:

如果你不想要小数点后那么多0 :

int main()
{
	float a = 7 / 2.0;
	printf("%.1f\n", a);  //%.nf表示浮点数小数点后打印n位
	return 0;
}

完美!

 13-2 移位操作符

涉及二进制,暂时不讲,后续会讲

>>  //右移
<<  //左移

13-3 位操作符

暂时不讲,后续会讲

&  //按位与
^  //按位异或
|  //按位或

13-4 赋值操作符

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

解释如下:

int main()
{
	int a = 0;  //初始化
	a = 20;  //赋值

	a = a + 3;  //a=23
	a += 3;  //相当于a=a+3

	a = a - 3;
	a -= 3;  //相当于a=a-3

	return 0;
}

其余的同理

13-5 单目操作符

什么是单目操作符?

 a+b  //操作数是两个(a和b),所以+是双目操作符,单目操作符的操作数只有一个

单目操作符有哪些?

!      逻辑反操作
-      负值
+      正值
&      取地址
sizeof 操作数的类型长度(以字节为单位)
~      对一个数的二进制按位取反
--     前置、后置--
++     前置、后置++
*      间接访问操作符(解引用操作符)
(类型) 强制类型转换

!

在C语言中,0表示假,非0表示真

代码举例:

int main()
{
	int flag = 0;  //为假
	if (!flag)  //为真,可以通过
	{
		printf("Hello World!");
	}
	return 0;
}

成功打印: 

再举一个例子:

int main()
{
	int flag = -1;  //为真
	if (!flag)  //为假,不能通过
	{
		printf("Hello World!");
	}
	return 0;
}

没有输出:

-

正变负,负变正

举例如下:

int main()
{
	int a = -10;
	int b = -a;
	printf("%d\n", b);
	return 0;
}

代码结果:

+

相当于没有,対值没有影响

int main()
{
	int a = -10;
	int b = +a;
	printf("%d\n", b);
	return 0;
}

结果如下:

&

这个在指针部分讲

sizeof

请大家记住:sizeof不是函数,而是操作符,并且是单目操作符!

举例:

int main()
{
	int a = 10;
	printf("%d\n", sizeof(a));
	printf("%d\n", sizeof(int));
	return 0;
}

结果如下:

 值得一提的是,sizeof(a)中的()可以去掉,这也证明了sizeof是操作符而不是函数:

int main()
{
	int a = 10;
	printf("%d\n", sizeof a);
	return 0;
}

仍然成功运行: 

但是要注意,sizeof(int)时的()不能省略 (红色曲线表示有问题)

我们再拓展一下吧~~~

int main()
{
	int arr[10] = { 0 };
	printf("%d\n", sizeof(arr));
	return 0;
}

结果如下: 

所以,此时计算的是整个数组的大小,单位是字节

 计算arr[0]的大小:

int main()
{
	int arr[10] = { 0 };
	printf("%d\n", sizeof(arr));
	printf("%d\n", sizeof(arr[0]));
	return 0;
}

结果如下:

其实计算的就是数组中一个元素的大小

那如果计算sizeof(arr)/sizeof(arr[0])呢?

int main()
{
	int arr[10] = { 0 };
	printf("%d\n", sizeof(arr));
	printf("%d\n", sizeof(arr[0]));
	printf("%d\n", sizeof(arr)/sizeof(arr[0]));
	return 0;
}

结果不出意外,是10:

我们仔细想一想,这不就是该数组中元素的个数吗?40是数组中元素总的大小,4是1个元素的大小,那么40/4=10就是数组中元素的个数。所以我们得出结论:

求数组中元素的个数(以数组名为arr举例):

sizeof(arr)/sizeof(arr[0])

~

涉及到二进制,后期再讲

++

有前置和后置之分 

后置++:先使用,后++

int main()
{
	int a = 10;
	int b = a++;
	printf("b=%d\n", b);
	printf("a=%d\n", a);
	return 0;
}

结果如下:

 先使用,后++解释该代码,其实就是先把a的值赋给b,a的值再++

前置++:先++,后使用

int main()
{
	int a = 10;
	int b = ++a;
	printf("b=%d\n", b);
	printf("a=%d\n", a);
	return 0;
}

结果如下:

先++,后使用解释该代码,其实就是a的值先++,再把a的值赋给b

--

有前置和后置之分,与++同理

后置--:先使用,后--

测试代码:

int main()
{
	int a = 10;
	int b = a--;
	printf("b=%d\n", b);
	printf("a=%d\n", a);
	return 0;
}

结果如下:

前置--:先--,后使用

测试代码:

int main()
{
	int a = 10;
	int b = --a;
	printf("b=%d\n", b);
	printf("a=%d\n", a);
	return 0;
}

结果如下:

 *

后期再讲

(类型)

举例:

int main()
{
	int a = 3.14;
	printf("%d\n", a);
	return 0;
}

运行后,编译器给出提示:

这是因为,3.14是字面浮点数,编译器默认理解为double类型

我们用(类型)进行强制类型转换:

int main()
{
	int a =(int) 3.14;
	printf("%d\n", a);
	return 0;
}

运行结果:

 编译器不再提醒:

13-6 关系操作符

>
>=
<
<=
!=  //用来测试“不相等”
==  //用来测试“相等”

 区分=与==

请大家考虑下面代码是否能够成功打印"Hello World!":

int main()
{
	int a = 10;
	if (a = 3)
	{
		printf("Hello World!");
	}
	return 0;
}

 答案是可以:

因为a=3是赋值,并不是判断a是否等于3。a起初是10,后来又被赋值为3,()里面的结果就是3,3非0,为真,所以成功打印

那么下面代码是否能够成功打印"Hello World!"呢?

int main()
{
	int a = 10;
	if (a == 3)
	{
		printf("Hello World!");
	}
	return 0;
}

答案是不能:

 这里用的是a==3,是判断a是否等于3,很明显,a的值是10,并不等于3,自然就无法打印

13-7 逻辑操作符

&&  逻辑与  并且
||  逻辑或  或者

举一个生活中的例子:

①甲需要乙并且丙帮忙,那么乙和丙缺一不可

②甲需要乙或者丙帮忙,那么乙来、丙来、乙丙都来这三种情况都可以

&&

例子1:

int main()
{
	int a = 1;
	int b = 2;
	if (a&&b)  //a和b都为真才能打印
	{
		printf("Hello World!");
	}
	return 0;
}

结果:

例子2:

int main()
{
	int a = 0;
	int b = 2;
	if (a&&b)  //a和b有一个是0就不能打印
	{
		printf("Hello World!");
	}
	return 0;
}

 结果:

例子3:

int main()
{
	int a = 0;
	int b = 0;
	if (a&&b)  //a和b都为0当然也不能打印
	{
		printf("Hello World!");
	}
	return 0;
}

结果: 

||

例子1:

int main()
{
	int a = 10;
	int b = 23;
	if (a||b)  //a和b都为真当然能打印
	{
		printf("Hello World!");
	}
	return 0;
}

结果:

例子2:

int main()
{
	int a = 10;
	int b = 0;
	if (a||b)  //a和b有一个为真就能打印
	{
		printf("Hello World!");
	}
	return 0;
}

结果:

例子3:

int main()
{
	int a = 0;
	int b = 0;
	if (a||b)  //只有a和b都为0的时候不能打印
	{
		printf("Hello World!");
	}
	return 0;
}

 结果:

 13-8 条件操作符

也叫三目操作符:

exp1?exp2:exp3
//exp:表达式

含义:表达式1为真,表达式2的值为结果;表达式1为假,表达式3的值为结果。

举一个简单的例子:

int main()
{
	int a = 10;
	int b = 23;
	int r = a > b ? a : b;
	printf("%d\n", r);
	return 0;
}

代码结果:

其实很好理解,如果a>b,就取a的值作为结果,反之, 取b的值作为结果

当然,这个三目操作符可以嵌套,但是建议不要太复杂,这样不便于自己和他人理解

13-9 逗号表达式

理解:逗号表达式就是逗号隔开的一串表达式

特点:从左向右依次计算,整个表达式的结果是最后一个表达式的结果

举一个例子吧:

int main()
{
	int a = 10;
	int b = 20;
	int c = 0;
	//       c=8   a=28  5
	int r = (c=a-2,a=b+c,c-3);
	printf("%d\n", r);
	return 0;
}

结果如下:

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

[]  ()  .  ->

[]

我们可以从以下程序理解:

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };  //定义数组的语法形式,并不是操作符
	arr[3] = 20;
	printf("%d\n", arr[3]);
	return 0;
}

结果如下:

其实,在arr[3]=20中,[]就是下标引用操作符,arr和3就是[]的操作数

这里要注意,如果有变量n=3,arr[n]=20依旧可以运行,因为这里并不是创建数组,而是访问数组元素

换句话说,变量的值是程序运行出来的,而定义数组大小的时候要用常量明确给出数组大小

()

int Max(int x, int y)
{
	if (x > y)
	{
		return x;
	}
	else
	{
		return y;
	}
}

int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	printf("%d\n", Max(a, b));  //Max(a,b)中的()就是函数调用操作符,Add,2,3是()的操作数
	return 0;
}

.

后续再讲

->

后续再讲

呼~~~操作符咱们就暂且说到这里,由于是“初识”系列,所以有的没有讲,有的没有太深入,后续的文章会进行补充!

  • 64
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值