(刚接触编程的小白,欢迎指正)
前言
操作符作为C语言中基础的的内容,也是非常重要的一部分。下面是所有操作符的分类。
操作符的分类
算术操作符: - * / %
移位操作符: >> <<
位操作符: & | ^ ~
赋值操作符: = = -= *= /= %= <<= >>= &= |= ^=
单⽬操作符:! -- & * - ~ sizeof 、 ( 类型 )
关系操作符: > >= < <= == !=
逻辑操作符: && ||
条件操作符:? :
逗号表达式: ,
下标引⽤: []
函数调⽤: ()
结构成员访问: . ->
上述操作符众多,但本篇我们讲解的是:
算术操作符: - * / %; 移位操作符: >> <<; 逻辑操作符: && ||; 位操作符: & | ^ ~; 逗号表达式: ,; 下标引⽤: []。
1.0 算术操作符: - * / %
这五个算数操作符在编程的代码中使用频率是很高的,但也是很简单的。
1.1 举例
代码语言:javascript复制#include <stdio.h>
int main()
{
int a = 10;
int b = 2;
printf("a b = %dn", a b);//12
printf("a - b = %dn", a - b);//8
printf("a * b = %dn", a * b);//20
printf("a / b = %dn", a / b);//5
printf("a %% b = %dn", a % b);//0
return 0;
}
代码运行:
有以上代码可知,“ ”就是加,“-”就是减,而乘法和除法在计算机中的表示则为:* /,最后一个%,是取模的意思,10 / 2 = 5......0,取模就是去除法所余的数。
注意:若想打印%取模这个符号,需要“%%”,这就涉及到printf()中的占位符知识了,现在我们只需要记住“%%”输出一个百分号。如上述代码printf("a %% b = %dn", a % b)。
2.0 逻辑操作符: && || !
逻辑运算符提供逻辑判断功能,⽤于构建更复杂的表达式,主要有下⾯三个运算符。
! :逻辑取反运算符(改变单个表达式的真假)。
&&::与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。
|| :或运算符,就是或者的意思(两侧⾄少有⼀个表达式为真,则为真,否则为假)。
2.1 逻辑取反运算符 !
比如:创建一个变量a=0为假,!a为真则打印。
代码语言:javascript复制int main()
{
int a = 0;
if (!a)
pritnf("%d", a);
return 0;
}
如果a为真,则!a为假。相反,如果a为假,则!a为真。
上述代码,则是a为假,则!a为真,打印a的值。
2.2 与运算符 &&
一假则为假。全真则为真。
&& 就是与运算符,也是并且的意思, && 是⼀个双⽬操作符,使⽤的⽅式是a&&b , && 两边的表达式都是真的时候,整个表达式才为真,只要有⼀个是假,则整个表达式为假。
代码语言:javascript复制举例:3~5月是春季,用代码怎么实现?
int main()
{
int month = 0;
scanf("%d", &month);
if (month >= 3 && month <= 5)//注意在代码中3~5不能写成
{ //3<=month<=5,这样的写法是错误的
printf("春季n");
}
return 0;
}
这样就实现了,达到我们想要的效果。
2.3 或运算符 ||
一真则为真,全假则为假。
|| 就是或运算符,也就是或者的意思, || 也是⼀个双⽬操作符,使⽤的⽅式是 a || b , ||两边的表达式只要有⼀个是真,整个表达式就是真,两边的表达式都为假的时候,才为假。
代码语言:javascript复制举例:⼀年中⽉份是12⽉或者1⽉或者2⽉是冬天,那么我们怎么使⽤代码体现呢?
int main()
{
int month = 3;
scanf("%d", &month);
if (month == 12 || month == 1 || month == 2)
{
printf("冬季n");
}
}
最后让我们做一道例题巩固一下。
例题:0~3000之间哪些是闰年,打印出来
我们知道,闰年的判断标准是:
- 能被4整除,但不能被100整除。
- 能被400整除。
那么用代码应该怎么实现呢?
代码语言:javascript复制#include<stdio.h>
//代码1
int main()
{
int year = 0;
for (year = 0; year <= 3000; year )
{
if (year % 4 == 0 && year % 100 != 0 )
{
printf("%d ", year);
}
else(year % 400 == 0)
{
printf("%d ", year);
}
}
return 0;
}
//代码2
int main()
{
int year = 0;
for (year = 0; year <= 3000; year )
{
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
{
printf("%d ", year);
}
}
return 0;
}
由于打印出来的数真的是太多了,各位自行去打印。
3.0 位操作符: & | ^ ~
注意:这四个操作符都必须是整数。
在讲未操作符之前,我们要先讲一下,原码,反码,补码。这是非常重要的。
3.1 原码,反码,补码
整数的二进制有三种,即原码,反码,补码。
二进制由符号位和数值位组成,其中二进制的最高就是符号位,其他剩余的都是数值位。
正数的原码,反码,补码都相同。
负数则三种都不同。
二进制中最高位为“0”表示正数,“1”表示负数。
原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。
反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。
补码:反码 1就得到补码。
3.2 &(按位与)
有0则为0,全1则为1。
0&0=0;0&1=0;1&0=0;1&1=1
直接上代码
代码语言:javascript复制int main()
{
int a = 3;
int b = -5;
int ret = a & b;
//10000000 00000000 00000000 00000101 -5的原码
//11111111 11111111 11111111 11111010 -5的反码
//
//11111111 11111111 11111111 11111011 -5的补码
//00000000 00000000 00000000 00000011 3的原码
//有0为0,全1为1
//00000000 00000000 00000000 00000011 结果
printf("%d", ret);//3
return 0;
}
3.3 | (按位或)
有1为1,全0则为0。
1|1=1;1|0=1;0|1=1;0|0=0
代码语言:javascript复制int main()
{
int a = 3;
int b = -5;
int ret = a | b;
//10000000 00000000 00000000 00000101 -5的原码
//11111111 11111111 11111111 11111010 -5的反码
//
//11111111 11111111 11111111 11111011 -5的补码
//00000000 00000000 00000000 00000011 3的原码
//有1为1,全0为0
//11111111 11111111 11111111 11111011 a | b的补码
//进行取反 1
//10000000 00000000 00000000 00000101 结果
printf("%d", ret);//-5
return 0;
}
3.4 ^ (按位异或)
相同为0,相异为1。
0^0=0;0^1=1;1^0=1;1^1=0
代码语言:javascript复制int main()
{
int a = 3;
int b = -5;
int ret = a ^ b;
//10000000 00000000 00000000 00000101 -5的原码
//11111111 11111111 11111111 11111010 -5的反码
//
//11111111 11111111 11111111 11111011 -5的补码
//00000000 00000000 00000000 00000011 3的原码
// 相同为0,相异为1
//11111111 11111111 11111111 11111000 a ^ b补码
//进行取反 1
//10000000 00000000 00000000 00001000 结果
printf("%d", ret);//-8
return 0;
}
3.5 ~ (按位取反)
代码语言:javascript复制int main()
{
int a = 5;
//00000000 00000000 00000000 00000101 5的原码、反码、补码
//所以数取反
//11111111 11111111 11111111 11111010 ~a的补码
//进行取反 1
//10000000 00000000 00000000 00000101 结果
printf("%d", ~a);//-6
return 0;
}
4.0 移位操作符: >> <<
(值得注意的是,移位只能是整形,且对于移位运算符,不要移动负数位,这个是标准未定义的。)
4.1 >> (右移操作符)
右移操作符分为两种
- 逻辑右移:边⽤0填充,右边丢弃
- 算数右移:左边⽤原该值的符号位填充,右边丢弃
具体用哪一种,这取决于编译器,一般情况下都是用,算数右移。
代码语言:javascript复制int main()
{
int a = 5;
a = a >> 1;
printf("%d", a);
return 0;
}
1.逻辑右移
代码语言:javascript复制 int n = -1;
11111111 11111111 11111111 11111111 -1补码
01111111 11111111 11111111 11111111 1 n>>1
左边补1位 右边丢1位
2.算数右移
代码语言:javascript复制 int n = -1;
11111111 11111111 11111111 11111111 -1补码
11111111 11111111 11111111 11111111 1 n>>1
左边补1位 右边丢1位
4.2 <<(左移操作符)
左移规则:左边抛弃,右边补0
代码语言:javascript复制int main()
{
int a = 5;
a = a << 1;
printf("%d", a);
return 0;
}
代码语言:javascript复制
int n = 5;
00000000 00000000 00000000 00000101 n的原,反,补码
0 00000000 00000000 00000000 00001010 n << 1
左边丢1位 右边丢1位
5.0 逗号表达式: ,
逗号表达式,用逗号隔开多个表达式。
逗号表达式,从左向右依次执⾏。整个表达式的结果是最后⼀个表达式的结果。
代码语言:javascript复制 int a = 2;
int b = 4;
int c = (a b,a * b);
6.0 下标引⽤: [ ]
操作数:⼀个数组名 ⼀个索引值
代码语言:javascript复制 int arr[10];