操作符详解(一)

2024-10-09 20:10:34 浏览数 (1)

(刚接触编程的小白,欢迎指正)

前言

操作符作为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 , && 两边的表达式都是真的时候,整个表达式才为真,只要有⼀个是假,则整个表达式为假。

举例:3~5月是春季,用代码怎么实现?

代码语言:javascript复制
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 , ||两边的表达式只要有⼀个是真,整个表达式就是真,两边的表达式都为假的时候,才为假。

举例:⼀年中⽉份是12⽉或者1⽉或者2⽉是冬天,那么我们怎么使⽤代码体现呢?

代码语言:javascript复制
int main()
{
	int month = 3;
    scanf("%d", &month);
    if (month == 12 || month == 1 || month == 2)
    {
        printf("冬季n");
    }
}

最后让我们做一道例题巩固一下。

例题:0~3000之间哪些是闰年,打印出来

我们知道,闰年的判断标准是:

  1. 能被4整除,但不能被100整除。
  2. 能被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 >> (右移操作符)

右移操作符分为两种

  1. 逻辑右移:边⽤0填充,右边丢弃
  2. 算数右移:左边⽤原该值的符号位填充,右边丢弃

具体用哪一种,这取决于编译器,一般情况下都是用,算数右移。

代码语言: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];

0 人点赞