其他分享
首页 > 其他分享> > 【C语言基础入门】2.C语言中四则运算、关系运算、逻辑运算与位运算

【C语言基础入门】2.C语言中四则运算、关系运算、逻辑运算与位运算

作者:互联网

文章目录

一、概述 

二、四则运算(+,-,*,/,%)

三、关系运算(<,>,<=,>=,==,!=)

四、逻辑运算与位运算 

五、深度剖析位运算


一、概述 

 C语言中支持下面4种类型的运算

运算类型运算符
四则运算+,-,*,/,%
关系运算<,>,<=,>=,==,!=
逻辑运算&&,||,!
位运算&,|,^,>>,<<,~

二、四则运算(+,-,*,/,%)

 注意:

        C语言中的除法运算,其除数不能为0

         下面通过一段程序感受一下:

#include <stdio.h>

int main()
{
    int a = 5;
    int b = 2;
    double c = 3;

    c = a / b;

    printf("c = %f\n", c);

    c = a % b;

    printf("c = %f\n", c);

    return 0;
}

         下面为输出结果:

         通过上面的代码,可以得到一些小结论

三、关系运算(<,>,<=,>=,==,!=)

        如上面的图片所示,c 的值就为0 

        下面通过一段代码,感受一下:

#include <stdio.h>

int main()
{
    int a = 1;
    int b = 2;
    int c = 3;

    c = a != b;

    printf("c = %d\n", c);

    c = a - b >= a + b;

    printf("c = %d\n", c);

    c = (a < b) + (c < b);

    printf("c = %d\n", c);

    return 0;
}

        下面为输出结果:

         小技巧:如果不同类型的运算同时出现在一个表达式中,那么尽量使用括号()指明运算顺序。

        下面看一段代码,深入感受一下运算优先级:

#include <stdio.h>

int main()
{
    int a = 1;
    int b = 2;
    int c = 0;

    c = a != b + a * b;

    printf("c = %d\n", c);

    return 0;
}

         下面为输出结果,可以看出,c 的输出结果为1,为什么为1呢?这是由于乘法优先级大于加法优先级大于关系运算优先级,所以程序执行过程是这样,先计算 a * b,然后将 a * b 的结果 2 加上 b,得到4,最后再比较 a != 4,得到的结果当然为1啦,我们还可以通过反汇编来观察代码的执行过程。

c = a != b + a * b的汇编代码

          所以如果想得到a != b 再加上 a * b的结果,一定要记得加括号,如下:

#include <stdio.h>

int main()
{
    int a = 1;
    int b = 2;
    int c = 0;

    c = (a != b) + (a * b);

    printf("c = %d\n", c);

    return 0;
}

         这样才能得到正确结果,如下所示:

小结:

四、逻辑运算与位运算 

&&运算
左操作数右操作数结果
000
010
100
111
||运算
左操作数右操作数结果
000
011
101
111

         话不多说,上代码:

#include <stdio.h>

int main()
{
    int a = 1;
    int b = 2;
    int c = 0;

    c = a && b;

    printf("c = %d\n", c);

    c = !(a - b) || (c < b);

    printf("c = %d\n", c);

    c = 10000;
    c = !!c;

    printf("c = %d\n", c);

    return 0;
}

        下面为运行结果:

运算符含义示例优先级
~按位求反~0101 -> 10101(高)
<<左移:高位移出,低位补00011 << 1 -> 0110 2
>>右移:低位移出,高位补符号位0101 >> 2 -> 00012
&按位与0111 & 1100 -> 01003
^按位异或:相同为0,不同为10111 ^ 1100 -> 10114
|按位或0111 | 1100 -> 11115(低)

 注:

1.按位与和逻辑与的计算法相同:两者为1,结果为1,否则为0

2.按位或和逻辑或的计算法相同:两者为0,结果为0,否则为1

         代码如下:

#include <stdio.h>

int main()
{
    printf("c = %d\n", 5 | 2);
    printf("c = %d\n", 7 ^ 8);
    printf("c = %d\n", 2 ^ 3);
    printf("c = %d\n", (15 >> 2) & 13);
    printf("c = %d\n", 173 ^ 60);

    return 0;
}

        运行结果如下:

         这里需要特别注意:对某一位或者某几位取反可以用异或(^)运算,这在工程里常用!!!

五、深度剖析位运算

         如下面的一段代码:

short a = 1;
int b = 4;
int c = a | b;
printf("c = %d\n",c);

        b为int类型,占4个字节,a为short类型,占2个字节。所以a要先要补符号位,由于a是正数,所以补0,这样就可以进行位运算了,得出c的结果为5。 

        下面来看一段代码:

#include <stdio.h>

int main()
{
    short a = 1;
    short b = 2;
    int c = a - b;

    c = c >> 4;

    printf("c = %d\n", c);

    c = c * -1 * 16 >> 4;

    printf("c = %d\n", c);

    printf("c = %d\n", 16 << 2);

    return 0;
}

         下面为输出结果:

        再看一段代码:

#include <stdio.h>

int main()
{
    char c = 'A';
    short a = c;
    int b = c;

    printf("c = %c\n", c);
    printf("c = %d\n", c);
    printf("a = %d\n", a);
    printf("b = %d\n", b);

    c = 0x40;

    printf("c = %x\n", c);
    printf("c = %d\n", c);

    c = c << 1;

    printf("c = %d\n", c);

    c = c << 1;

    printf("c = %d\n", c);

    return 0;
}

        下面为输出结果:

         需要注意的是,因为c为char类型,所以64左移1位后,用二进制表示为1000 0000,最高位的1表示符号位,所以就是-128。

标签:操作数,逻辑运算,优先级,运算,int,C语言,按位,printf
来源: https://blog.csdn.net/weixin_43129713/article/details/121035094