【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)
里面的“==” 是用以测试“相等”
不要掉“=”!!!单个“=”是赋值。