2020-11-12

【C语言】操作符/运算符易犯小错集合

这篇是操作符运用错误(数学计算错误 )的小集合!
都是自己犯过的错,贴在这里不断复习总结,也许会更新。
建议数学不好的自己算一遍再看答案(会有幡然醒悟的感慨

算术操作符

C语言中算术操作符用于各类数值运算。
基础的五种:

加(+)、减(-)、乘(*)、除(取整,/)、求余(或称模运算,%)

加减乘运算出错比较少,主要的错误都会出在取整和求余傻傻分不清。
先说除法运算:

当运算符 / 的操作数(被除数和除数)均为整数时,结果为取商(取整)。
如:5 / 2 == 2;
当运算符 / 的操作数中有一个或两个浮点数时,结果包含整数部分和小数部分。
如:6 / 2.5 == 2.4;

那么问题来了,下列程序的输出结果是多少?

int main()
{
	printf("%d\n", 5 / 2);
	printf("%.1f\n", (float)5 / 2);
	printf("%.1f\n", (float)5 / (float)2);
	printf("%.1f\n", (float)(5 / 2));
	return 0;
}

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

正解:
在这里插入图片描述
上例题应该看见答案就懂了该怎么算了。
再来模运算:

当运算符 的操作数均为整数时,结果为取余。
如:15 % 3 == 0;
当运算符 的操作数中有浮点数时,语法错误。
如:15 % 3.5 则语法错误;
运算符%两操作数都必须为整数,否则语法错误。

那么问题又来了,下列程序的输出结果是多少?

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

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

正解:
在这里插入图片描述
10 % 3 == 1应该都会做,那么有了负数该如何运算呢?
用比较直观的方式解释:
在这里插入图片描述

移位操作符

<<(左移)
x<<y
x 的每个位向左移动 y 个位
>>(右移)
x>>y
x 的每个位向右移动 y 个位

来简单看看这两个运算符的运用:
在这里插入图片描述

那么问题又双来了:

如何将一个数字,快速的扩大8倍?

答:

<< 3(相当于乘以2^3,即扩大8倍)

位操作符

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

照例用比较直观的方式解释一下:
在这里插入图片描述

总结:

& 有0则0,无0则1;
^ 不同则1,相同则0;
| 有1则1;

ps:0异或任何数字都是那个数字。

单目操作符

伶两个麻烦的拿出来讲讲:

1.sizeof (操作数的类型长度(以字节为单位)包含\0
2. * (间接访问操作符/解引用操作符)

首先声明:sizeof,不是函数!不是函数!不是函数!
人家是关键字
用来表示操作数的类型长度
前文有提到strlen()函数是求字符串长度的函数,那么它们有什么区别?上代码:

#include <stdio.h>
int main(){
	char str[] = "abc";
	printf("%d\n", strlen(str));
	printf("%d\n", sizeof(str));
	system("pause");
	return 0;
}

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

输出:在这里插入图片描述
可见:

strlen()不包含\0;
sizeof()包含\0。

*所表示“间接访问操作符or解引用操作符”在哪里用到呢?
上代码:

#include <stdio.h>
int main(){
	int a = 10;
	int *p = &a;//此时*代表了指针。
	printf("%d\n",*p);
	/*此时的*就叫做(间接访问操作符/解引用操作符),
	输出p中存储的地址用以间接访问a的存储内容。*/
	return 0;
}

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

更直观的表示就是:
在这里插入图片描述
那如果我偷偷把p里面的内容换掉呢?

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

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

和想象的一样吗?
在这里插入图片描述

逻辑操作符

&& 逻辑与(并且/短路与)
|| 逻辑或(短路或)

对于逻辑与来说:
表达式1 && 表达式2,要表达式1和2同时为真则结果为真,若表达式1为假则不会去执行表达式2;
那么问题又双叒来了,下面程序会输出什么?

#include <stdio.h>
int main(){
	int a = 1;
	int b = 0;
	int c = 2;
	if (a++ && b++ && c++)
	{
		printf("一:%d,%d,%d\n", a, b, c);
	}
	else
	{
		printf("二:%d,%d,%d\n", a, b, c);
	}
	return 0;
}

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

正解:
在这里插入图片描述
怎么来的?
在这里插入图片描述
对于逻辑或来说:
表达式1 || 表达式2,要一个表达式为真则结果为真,若表达式1为真则不会去执行表达式2;
把上面的代码改改:

#include <stdio.h>
int main(){
	int a = 1;
	int b = 0;
	int c = 2;
	if (a++ || b++ || c++)
	{
		printf("一:%d,%d,%d\n", a, b, c);
	}
	else
	{
		printf("二:%d,%d,%d\n", a, b, c);
	}
	return 0;
}

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

做对了吗?
在这里插入图片描述

条件操作符(三目运算符)

这是唯一的三目运算符:

exp1 ? exp2 : exp3

exp1为真则执行exp2并将其值赋给exp1,为假则执行exp3并将其值赋给exp1。
那么问题又双叒叕来了,下面程序会输出什么?

#include <stdio.h>
int main(){
	int a = 1;
	int b = 0;
	int c = 2;
	int d = a ? (b == 1 ? c : a) : c;
	printf("%d\n", d);
	return 0;
}

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

答案是:
在这里插入图片描述

a为真则执行(b == 1 ? c : a)
b为假, 则(b == 1 ? c : a)结果为a即为1
把1赋值给a在赋值给d

逗号表达式

这个很少用,记录一下用法:

exp1,exp2,exp3,…expN
整个表达式的结果都为expN

#include <stdio.h>
int main(){
	int a = 10;
	int b = 20;
	int d = (10, 20, 30, 40, 50);
	printf("%d\n", d);
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

结果不出意料:
在这里插入图片描述

END

写的最久的一篇博客,运算符真的很多。
还需要细心分清,也不要在应该用的地方打错。

特指 if(a == 1)
里面的“==” 是用以测试“相等”
不要掉“=”!!!单个“=”是赋值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值