C 语言的运算符

算术运算

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

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

逻辑运算

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

|| 和 &&

逻辑与 &&:两侧表达式都为真时,表达式为真,不然为假。
逻辑或 ||:两侧表达式都为假时,表达式才为假,不然为真。数组

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

#include <stdio.h>

int main()
{
	int a = 6;
	int res;
	res = ((a == 6) || printf("right express run\n"));
	printf("end of main,res is:%d\n", res);
}

输出为:svg

end of main,res is:1

>、>=、<、<=

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

! 逻辑取反

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

?:

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

位运算

<< 和 >>

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

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

#include <stdio.h>

int main()
{
	char a = 0x1;
	int i;
	for (i = 0; i < 8; i++)
	{
		a = a<<1;
		printf("0x%x\n", a);
	}
	
	a = 1;
	for (i = 0; i < 8; i++)
	{
		a = a>>1;
		printf("0x%x\n", a);
	}
	
	a = -1;
	for (i = 0; i < 8; i++)
	{
		a = a>>1;
		printf("0x%x\n", a);
	}
	
	unsigned char b = -1;
	for (i = 0; i < 8; i++)
	{
		b = b>>1;
		printf("0x%x\n", 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\n", a);
	a = a & (~(1 << 3));	// 0000 0001,为了安全,这里不要直接计算
	printf("%x\n", 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\n", p1.name, p1.id);
	
	p2->id = 888;
	printf(" %d\n", p2->id);
}

& 和 *

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

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

相关文章
相关标签/搜索