【C语言基础】操作符专题

目录

一、除法—"/"与取模—"%"

二、右移—">>"和左移—"<<"

三、位操作符

1、按位与"&"

2、按位或"|"

3、按位异或"^"

四、复合赋值操作符

五、单目操作符

1、非—"!"

2、取地址—"&"和解地址—"*"

3、sizeof

5、自增—"++"

6、强制类型转换—" ( ) "

六、逻辑操作符—"&&"和"||"

七、逗号表达式

八、三目操作符——条件操作符


一、除法—"/"与取模—"%"

/ 是除法,%是取模。

5除以2商2余1。

分别表示  5/2=2(取商)

             5%2=1(取余)

若需输出小数,使用浮点数定义

#include <stdio.h>
int main()
{
    double i=5;
    i=5/2.0;
    printf("%lf",i);
    return 0; 
}

%d:整型输出,%ld长整型输出⭐

%o:以八进制数形式输出整数,打印的是无符号类型

%x:以十六进制数形式输出整数,%X以大写字母输出,打印的是无符号类型

%u:以十进制数输出unsigned型数据(无符号数)

%c:用来输出一个字符,如果是数字则是ASCII码值对应的字符⭐

%s:用来输出一个字符串⭐

%e以指数形式输出实数

%g:根据大小自动选f格式或e格式,且不输出无意义的零

%p:专门用来打印地址⭐

%hd:打印以十进制显示short类型的整数

%f:单精度浮点型,用来输出实数,以小数形式输出,对应float⭐

%lf:双精度浮点型,用来输出实数,以小数形式输出,对应double⭐


二、右移—">>"和左移—"<<"

右移操作符

1.算数右移

  右边丢弃,左边补原符号位——正数补0,负数补1

2.逻辑右移

  右边丢弃,左边补0。

#include<stdio.h>

int main()

{

    int a=16;

    int b=a>>1;//>> 右移操作符,移动的是二进制位

    printf("%d",b);

    return 0;

}

声明:一个int包含4个字节,32个比特位,作图时32个数字不太美观,此处省略

8f03ed4b9bf740a6bbe591b5f1dcef14.jpg

整数的二进制表示有:原码、反码、补码

储存到内存的是补码

例如-1

   1000 0000 0000 0001 原码

  
   1111 1111 1111 1110     反码,符号位不变,                                           其余取反
   1111 1111 1111 1111       补码,反码加1

左移操作符:左边丢弃,右边补0

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

0947973ab8e649358639da6daeaf8327.jpg

效果实现:

左移n位乘2的n次方,右移n位除2的n次方,-1和1右移除外。

警告:不要向右或向左移动-1(负数位)

       移位操作符只能用于整数。


三、位操作符

&   按位与

|    按位或

^   按位异或

1、按位与"&"

看代码理解,按二进制位 与 或 异或

#include<stdio.h>
int main()
{
    int a=3;
    int b=5;
    int c=a&b;
    //a:0000 0000 0000 0000 0000 0000 0000 0011
    //b:0000 0000 0000 0000 0000 0000 0000 0101
    //c:0000 0000 0000 0000 0000 0000 0000 0001
    //注意事项:竖列里,有一个0就是0,都为1才是1
    //正数的原反补码相同,若为负数则需换成补码再操作
    printf("%d",c);
   return 0;
}

2、按位或"|"

#include<stdio.h>

int main()

{

    int a=3;

    int b=5;

    int c=a|b;

    //a:0000 0000 0000 0000 0000 0000 0000 0011

    //b:0000 0000 0000 0000 0000 0000 0000 0101

    //c:0000 0000 0000 0000 0000 0000 0000 0111

    //注意事项:竖列里,有一个1就是1,都为0才是0

    //正数的原反补码相同,若为负数则需换成补码再操作

    printf("%d",c);

   return 0;

}

3、按位异或"^"

#include<stdio.h>
int main()
{
    int a=3;
    int b=5;
    int c=a^b;
    //a:0000 0000 0000 0000 0000 0000 0000 0011
    //b:0000 0000 0000 0000 0000 0000 0000 0101
    //c:0000 0000 0000 0000 0000 0000 0000 0110
    //注意事项:竖列里,相同为0,相异为1。
    //正数的原反补码相同,若为负数则需换成补码再操作
    printf("%d",c);
   return 0;
}

1.按位异或练习:不使用第三个变量,交换a,b两个变量

#include<stdio.h>

int main()

{

    int a=3;

    int b=5;

    /*int tmp=0;法一,但不符合题目要求

    tmp=a;

    a=b;

    b=tmp;*/

    /*a=a+b;法二,可能会溢出

    b=a-b;

    a=a-b;*/

    a=a^b;//法三

    b=a^b;

    a=a^b;

    printf("a=%d b=%d",a,b);

    return 0;

}

a       ∨  011          ∧  (110)      ∨  (110)

b       ∨  101          ∧  101        ∨  011

         ∨  (110)        ∧  011        ∨  101

跟着箭头的方向读,括号()里的看做是中间值。第二列011又得出了a的值,我们人为赋给b,同理,第三列101得出了b的值,我们认为赋给a,这样就实现了ab交换。

2.按位与练习:统计二进制数字中有多少个1

#include<stdio.h>
int main()
{
    /*int num=0;
    int count=0;
    scanf("%d",&num);//这个代码输入-1就会出问题
    while(num)
    {
       if(num%2==1)
          count++;
       num=num/2;
    }
    printf("%d",count);*/
    //下面我们使用按位与和移位操作符
    int i=0;
    int count=0;
    int num=0;
    printf("请输入要统计的十进制数:");
    scanf("%d",&num);
    for(i=0;i<32;i++)
    {
        if((num>>i)&1==1)
           count++;      
    }
    printf("%d", count);
    return 0;
}

11389ba6dc6c4d528f6949499dbca80d.jpg


四、复合赋值操作符

a=a+1  可以写成  a+=1
a=a>>1 可以写成  a>>=1

类似还有+=、-=、*=、/=、%=、&=、|=、^=、>>=、<<=


五、单目操作符

单目运算符:

  逻辑非运算符【!】

  按位取反运算符【~】

  自增自减运算符【++ --】

  负号运算符【-】

  类型转换运算符【(类型)】

  指针运算符和取地址运算符【*和&】

  长度运算符【sizeof】


1、非—"!"

#include<stdio.h>

int main()

{

    int a=0;

    if(!a)//a初始为0,表示假,!a在这里默认表示1,表示真

       printf("Hello");

    return 0;

}

2、取地址—"&"和解地址—"*"

#include<stdio.h>

int main()

{

    int a=10;

    int* p=&a;//取地址操作符

    *p=20;//解引用操作符

    return 0;

}

3、sizeof

#include<stdio.h>

int main()

{

    int a=10;

    char c='r';

    char* p=&c;

    int arr[10]={0};

    //sizeof计算的是变量所占内存空间的大小,单位是字节。

    printf("%d\n", sizeof(a));//4

    printf("%d\n", sizeof(c));//1

    printf("%d\n", sizeof(p));//32位平台所占4个字节

    printf("%d\n", sizeof(arr));//40

    return 0;

}

4、按位取反—"~"

#include <stdio.h>//
int main()
{
    int a=0;
 //0000 0000 0000 0000 0000 0000 0000 0000
 //1111 1111 1111 1111 1111 1111 1111 1111 补码
 //1000 0000 0000 0000 0000 0000 0000 0001 原码
    printf("%d",~a);//按(二进制位)位取反
    return 0; 
}

5、自增—"++"

#include<stdio.h>

int main()

{

    int a=10;

    printf("%d\n",++a);//前置a++,先a++,后使用

    printf("%d\n",a++);//后置a++,先使用,后++

    return 0;

}

6、强制类型转换—" ( ) "

#include<stdio.h>

int main()

{

    int a=(int)3.14;//强制类型转换

    printf("%d",a);

    return 0;

}

六、逻辑操作符—"&&"和"||"

          &&  逻辑与

          ||     逻辑或

区分逻辑与(&&)按位与(&)  逻辑或(‖)按位或(|)

七、逗号表达式

用逗号隔开多个表达式,逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。

#include<stdio.h>
int main()
{
    int a=1;
    int b=2;
    int c=(a>b,a=b+10,b=a+1);
    printf("%d",c);//13
    return 0;
}

八、三目操作符——条件操作符

表达式一 ?  表达式二 : 表达式三

#include<stdio.h>

int main()
{
    int a=0;
    int b=0;
    //if(a>5)
    // b=6;
    //else
    // b=-6;
    b=(a>5?6:-6);//一行搞定
    printf("%d",b);
    
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

畅游星辰大海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值