操作符详解(一)

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

前言

操作符作为C语言中基础的的内容,也是非常重要的一部分。下面是所有操作符的分类。

操作符的分类

算术操作符: +   -    *   /  %

移位操作符: >>  <<

位操作符: & | ^ ~

赋值操作符: =   +=  -=  *=  /=  %=  <<=  >>=  &=  |=  ^=

单⽬操作符:!  ++   --   &   *   +   -  ~  sizeof 、 ( 类型 )

关系操作符: >    >=    <    <=  ==  !=

逻辑操作符: &&  ||

条件操作符:?   :

逗号表达式: ,

下标引⽤: []

函数调⽤: ()

结构成员访问: .   ->

 

上述操作符众多,但本篇我们讲解的是:

算术操作符: +   -    *   /  %

移位操作符: >>  <<

逻辑操作符: &&  ||;

位操作符: & | ^ ~

逗号表达式: ,

标引⽤: []

目录

前言

1.0 算术操作符: +   -    *   /  %

1.1 举例

2.0 逻辑操作符: &&  || !

2.1 逻辑取反运算符 !

2.2 与运算符 &&

2.3 或运算符 ||

3.0 位操作符: & | ^ ~

3.1 原码,反码,补码

3.2 &(按位与)

3.3  | (按位或)

3.4 ^ (按位异或)

3.5 ~ (按位取反)

 

4.0 移位操作符: >>  <<

4.1 >> (右移操作符)

4.2 <<(左移操作符)

 

5.0 逗号表达式: ,

6.0 下标引⽤: [ ]


 

1.0 算术操作符: +   -    *   /  %

这五个算数操作符在编程的代码中使用频率是很高的,但也是很简单的。

1.1 举例

#include <stdio.h>
int main()
{
	int a = 10;
	int b = 2;
	printf("a + b = %d\n", a + b);//12
	printf("a - b = %d\n", a - b);//8
	printf("a * b = %d\n", a * b);//20
	printf("a / b = %d\n", a / b);//5
	printf("a %% b = %d\n", a % b);//0
	return 0;
}

代码运行:

1a916cff935c4138ad28644d4e2bed2b.png

有以上代码可知,“+”就是加,“-”就是减,而乘法和除法在计算机中的表示则为:* /,最后一个%,是取模的意思,10 / 2 = 5......0,取模就是去除法所余的数。

注意:若想打印%取模这个符号,需要“%%”,这就涉及到printf()中的占位符知识了,现在我们只需要记住“%%”输出一个百分号。如上述代码printf("a %% b = %d\n", a % b)。

2.0 逻辑操作符: &&  || !

逻辑运算符提供逻辑判断功能,⽤于构建更复杂的表达式,主要有下⾯三个运算符。

! :逻辑取反运算符(改变单个表达式的真假)。

&&::与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。

|| :或运算符,就是或者的意思(两侧⾄少有⼀个表达式为真,则为真,否则为假)。

2.1 逻辑取反运算符 !

af8144a79c904436a246b80165e8c56e.png

比如:创建一个变量a=0为假,!a为真则打印。

int main()
{
	int a = 0;
	if (!a)
		pritnf("%d", a);
	return 0;
}

如果a为真,则!a为假。相反,如果a为假,则!a为真。

上述代码,则是a为假,则!a为真,打印a的值。

2.2 与运算符 &&

一假则为假。全真则为真。

aaeb684461534bfb8dd9cc14dbfa38ec.png

&& 就是与运算符,也是并且的意思, && 是⼀个双⽬操作符,使⽤的⽅式是a&&b , && 两边的表达式都是真的时候,整个表达式才为真,只要有⼀个是假,则整个表达式为假。

举例: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 或运算符 ||

一真则为真,全假则为假。

9c3f413b64634a7bb7a358259d658fa7.png

|| 就是或运算符,也就是或者的意思, || 也是⼀个双⽬操作符,使⽤的⽅式是 a || b , ||两边的表达式只要有⼀个是真,整个表达式就是真,两边的表达式都为假的时候,才为假。

 

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

int main()
{
	int month = 3;
    scanf("%d", &month);
    if (month == 12 || month == 1 || month == 2)
    {
        printf("冬季\n");
    }
}

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

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

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

  1. 能被4整除,但不能被100整除。
  2. 能被400整除。

 那么用代码应该怎么实现呢?

#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

直接上代码

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

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

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 ~ (按位取反)

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. 算数右移:左边⽤原该值的符号位填充,右边丢弃

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

int main()
{
    int a = 5;
    a = a >> 1;
    printf("%d", a);
    return 0;
}

1.逻辑右移

   int n = -1;
   11111111 11111111 11111111 11111111     -1补码
   01111111 11111111 11111111 11111111 1   n>>1
左边补1位                          右边丢1位

 2.算数右移

   int n = -1;
   11111111 11111111 11111111 11111111     -1补码
   11111111 11111111 11111111 11111111 1   n>>1
左边补1位                          右边丢1位

4.2 <<(左移操作符)

左移规则:左边抛弃,右边补0

int main()
{
    int a = 5;
    a = a << 1;
    printf("%d", a);
    return 0;
}

 

    int n = 5;
    00000000 00000000 00000000 00000101  n的原,反,补码
  0 00000000 00000000 00000000 00001010  n << 1
左边丢1位                             右边丢1位

5.0 逗号表达式: ,

逗号表达式,用逗号隔开多个表达式。

逗号表达式,从左向右依次执⾏。整个表达式的结果是最后⼀个表达式的结果。

    int a = 2;
    int b = 4;
    int c = (a + b,a * b);

 

6.0 下标引⽤: [ ]

操作数:⼀个数组名+⼀个索引值

    int arr[10];

 

评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值