zoukankan      html  css  js  c++  java
  • C 语言的运算符

    算术运算

    C 语言支持 + - * / % 五种运算,加减乘除取模。

    所有 CPU 都内建加法器,可以完成加法操作。减法操作可以转为加法操作。大部分 CPU 都没有内置乘法器,此时编译器会把 * / 乘除运算转为加法运算,用软件来模拟乘法。

    逻辑运算

    逻辑运算的返回结果是 1 或 0,C 语言中没有布尔类型,真假即用 1 和 0 代替。

    || 和 &&

    逻辑与 &&:两侧表达式都为真时,表达式为真,否则为假。
    逻辑或 ||:两侧表达式都为假时,表达式才为假,否则为真。

    注意:C 语言在处理逻辑与 && 和逻辑或 || 时,如果逻辑与的左表达式为假或逻辑或的左表达式为真,则不会再执行右表达式。

    #include <stdio.h>
    
    int main()
    {
    	int a = 6;
    	int res;
    	res = ((a == 6) || printf("right express run
    "));
    	printf("end of main,res is:%d
    ", res);
    }
    

    输出为:

    end of main,res is:1
    

    >、>=、<、<=

    跟数学中的比较运算一致。

    ! 逻辑取反

    int a = 0x0;
    if (!a) printf("hello"); // a 逻辑取反后变成1,这一行会打印
    

    ?:

    三目运算符。a ? b : c 中,a 表达式为真时执行 b,否则执行 c。

    位运算

    << 和 >>

    按位左移 <<:相当于乘法,左移 n 位相当于乘以2的n次方。最低位一律补0。
    按位右移 >>:相当于除法,右移 n 位相当于除以2的n次方。有符号数最高位补符号位(负数补1,正数补0),无符号数最高位补0。

    例如对于 0x1(0000 0001),左移一位后,变为 0x2(0000 0010)。乘以 32 相当于左移 5 位。

    #include <stdio.h>
    
    int main()
    {
    	char a = 0x1;
    	int i;
    	for (i = 0; i < 8; i++)
    	{
    		a = a<<1;
    		printf("0x%x
    ", a);
    	}
    	
    	a = 1;
    	for (i = 0; i < 8; i++)
    	{
    		a = a>>1;
    		printf("0x%x
    ", a);
    	}
    	
    	a = -1;
    	for (i = 0; i < 8; i++)
    	{
    		a = a>>1;
    		printf("0x%x
    ", a);
    	}
    	
    	unsigned char b = -1;
    	for (i = 0; i < 8; i++)
    	{
    		b = b>>1;
    		printf("0x%x
    ", b);
    	}
    }
    

    &、|、^

    • 按位与 &:任意位与 0 按位与,得到0。按位与可以用来屏蔽某位。例如 a & 0xf0 可以屏蔽低 4 位。
    • 按位或 |:任意位与 1 按位或,得到1。按位或可以用来开启某位。例如 a | 0xf0 可以开启高 4 位。
    • 按位异或 ^:两位不同则为 1,否则为 0。主要用作算法上,工程上用的少。例如不借助中间变量交换两个变量的值:
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
    

    & 也叫清零器,| 也叫设置器。例如,将变量的第3位设置为1或清除为0:

    #include <stdio.h>
    
    int main()
    {
    	char a = 0x1;		// 0000 0001
    	a = a | (1 << 3); 	// 0000 1001
    	printf("%x
    ", a);
    	a = a & (~(1 << 3));	// 0000 0001,为了安全,这里不要直接计算
    	printf("%x
    ", a);
    }
    

    ~ 按位取反

    0xf0 按位取反得到 0x0f。

    赋值运算

    除了 = 赋值运算外,还可以在 C 语言中使用符合赋值运算符 +=、-=、*=、/= 、%=、&=、|=。例如上面的例子可以变成:

    a |= (1 << 3);		//a = a | (1 << 3);
    a &= (~(1 << 3)); 	//a = a & (~(1 << 3));
    

    内存访问运算

    小括号

    小括号除了可以改变优先级外,还可以用于函数访问。

    中括号

    方括号可以用在数组声明定义和使用中,用于访问指定内存。

    大括号

    函数体、struct、union 体。

    成员变量访问符 -> 和 .

    ->:地址访问。声明了指向 struct 类型的指针后,通过 -> 访问其中元素。
    .:变量访问。声明了 struct 类型的变量后,通过 . 访问其中元素。

    #include <stdio.h>
    #include <string.h>
    
    typedef struct People
    {
        char name[20];
        int id;
    } peo;
    
    int main()
    {
    	struct People p1;
    	peo* p2;
    	
    	strcpy(p1.name, "hello");
    	p1.id = 666;
    	printf("%s, %d
    ", p1.name, p1.id);
    	
    	p2->id = 888;
    	printf(" %d
    ", p2->id);
    }
    

    & 和 *

    & 作为单目运算符,后面跟变量时,表示取地址运算符。作为双目运算符时,表示按位与。

    * 作为单目运算符,后面跟变量时,表示指针运算符。作为双目运算符时,表示乘法。

  • 相关阅读:
    20155339 Exp9 Web安全基础
    20155339 Exp8 Web基础
    20155339 Exp7 网络欺诈防范
    20155339 Exp6 信息搜集与漏洞扫描
    20155339 Exp5 MSF基础应用
    20155339 Exp4 恶意代码分析
    20155339 Exp3 免杀原理与实践
    20155339平措卓玛 Exp2 后门原理与实践
    20155339平措卓玛 Exp1 PC平台逆向破解(5)M
    20155339 第16周课堂实践加分作业
  • 原文地址:https://www.cnblogs.com/kika/p/10851510.html
Copyright © 2011-2022 走看看