5.C语言常见运算符及其优先级

C语言运算符详解
本文详细介绍了C语言中的各类运算符,包括算术运算符、关系运算符、逻辑运算符、位运算符、条件运算符、逗号运算符以及自增自减运算符,并解释了它们的使用场景和优先级。

运算符

用算术运算符将运算对象(也称操作数)连接起来的、符合C语言规则的式子,称为C算术表达式。运算对象包括常量、变量、函数等。
例如:a * b / c - 1.5 + ‘a’

运算符的分类

1.双目运算符:即参加运算的操作数有两个
例:a + b

2.单目运算符:参加运算的操作数只有一个
例:++自增运算符
- -自减运算符
int a =10;
a++;

3.三目运算符:即参加运算的操作数有三个
例:条件运算符 () ? () : ()

1.算术运算符

+ , - , * , / ,% , += , -= , *= , /= , %=

10%3 表达式结果为1
复合运算符:
a += 3 相当于a=a+3
a *= 6+8 相当于 a=a*(6+8)

#include<stdio.h>
int main()
{
	int a = 10;
	int b = 20;
	int c = 0;
	c = a + b;
	printf("c=%d\n", c);

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

	a += 3;
	printf("a=%d\n", a);

	b += 2 * 8;
	printf("b=%d\n", b);
	return 0;
}

2.关系运算符

> , < , == , >= , <= , !=

一般用于判断条件是否满足或者循环语句

#include<stdio.h>
int main()
{
	int a = 10;
	int b = 20;
	int i;
	if (a > b)
	{
		printf("a>b\n");
	}
	if (a < b)
	{
		printf("a<b\n");
	}
	for (i = 0; i <= 100; i++)
	{
		printf("i=%d\n", i);
	}
	return 0;
}

3.逻辑运算符

  1. && 逻辑与
    两个条件都为真,则结果为真
    if ( (a>b) && (a<c) )
    注意:if (b < a < c) 这种表达方式是错误的
  1. || 逻辑或
    两个条件至少有一个为真,则结果为真
    if ( (a>b) || (a<c) )
  1. ! 逻辑非
    if ( !(a>b))
    {
    }
#include<stdio.h>
int main()
{
	int a = 10;
	int b = 20;
	int c = 30;
	if ((a < b) && (b > c))
	{
		printf("条件为真!\n");
	}
	else {
		printf("条件为假!\n");
	}
	if ((a < b) || (b > c))
	{
		printf("逻辑或的结果为真!\n");
	}
	if (!(a > b))
	{
		printf("逻辑非条件成立!\n");
	}
	return 0;
}

在这里插入图片描述

4.位运算符

十进制数转二进制数

123 / 2 = 61 余1
61 / 2 = 30 余1
30 / 2 = 15 余0
15 / 2 = 7 余1
7 / 2 = 3 余1
3 / 2 = 1 余1
1 / 2 = 0 余1
123 的二进制为 111 1011

原码反码补码
正数在内存中以原码形式存放,负数在内存中以补码的形式存放

正数:原码=反码=补码

原码:将一个整数,转换成二进制,就是其原码。
如单字节的5的原码为:0000 0101;-5的原码为 1000 0101。

反码:正数的反码就是其原码;负数的反码就是将原码中,除符号位以外,每一位取反。

如单字节5的反码为:0000 0101;-5的反码为 1111 1010。
补码:正数的补码就是其原码;负数的反码+1就是补码。
如单字节5的补码为:0000 0101; -5的补码为 1111 1011。
在计算机中,正数是直接用原码表示的,负数用补码表示。

#include<stdio.h>
int main()
{
	printf("%x\n",-5);
	return 0;
}
//1000 0000 0000 0000 0000 0000 0000 0101 -5的原码
//1111 1111 1111 1111 1111 1111 1111 1010 -5的反码
//1111 1111 1111 1111 1111 1111 1111 1011 -5的补码
// ff ff ff fb

位运算
无论正数还是负数,编译系统都是按照内存中存储的内容进行位运算。

  1. & 按位与
    任何值与0得0,与1保持不变
    使某位清零
    -5 & 10
    1111 1111 1111 1111 1111 1111 1111 1011
    0000 0000 0000 0000 0000 0000 0000 1010
    0000 0000 0000 0000 0000 0000 0000 1010
  1. | 按位或
    任何值或1得1,或0保持不变
    -5 | 10
    1111 1111 1111 1111 1111 1111 1111 1011
    0000 0000 0000 0000 0000 0000 0000 1010
    1111 1111 1111 1111 1111 1111 1111 1011
  1. ~ 按位取反
    0变1,1变0
    ~(-5)
    1111 1111 1111 1111 1111 1111 1111 1011
    0000 0000 0000 0000 0000 0000 0000 0100
#include<stdio.h>
int main()
{
	printf("%x\n",-5 & 10);//0000 0000 0000 0000 0000 0000 0000 1010
	printf("%x\n", -5 | 10);//1111 1111 1111 1111 1111 1111 1111 1011
	printf("%X\n", ~(-5));// 0000 0000 0000 0000 0000 0000 0000 0100
	return 0;
}
//1000 0000 0000 0000 0000 0000 0000 0101 -5的原码
//1111 1111 1111 1111 1111 1111 1111 1010 -5的反码
//1111 1111 1111 1111 1111 1111 1111 1011 -5的补码
// ff ff ff fb

在这里插入图片描述

  1. ^ 按位异或
    相异得1,相同得0
    1001 1100
    0101 1010
    - - - - - - - - -
    1100 0110
  1. 位移
    >> 右移
    << 左移
    注意右移分:逻辑右移、算术右移
    (1) 右移
    逻辑右移:高位补0,低位溢出
    0101 1010 >>3
    0001 1011
    算术右移:高位补符号位,低位溢出(有符号位)
    1010 1101 >>3
    11110 1011

在一个编译系统中到底是逻辑右移还是算术右移,取决于编译器。

//判断右移是逻辑右移还是算术右移
#include<stdio.h>
int main()
{
	printf("%d\n", (-1) >> 3);
	return 0;
}// 1000 0000 0000 0000 0000 0000 0000 0001
// 1111 1111 1111 1111 1111 1111 1111 1111

(2) 左移 << 高位溢出,低位补0
5 << 1
0000 0101
0000 1010

5.条件运算符

() ? () : ()

A ? B : C
如果?前面的表达式成立,整个表达式的值是?和 : 之间的表达式的结果
否则是之后表达式的结果

#include<stdio.h>
int main()
{
	int a;
	a = ((3 < 5) ? 8 : 9);
	printf("a=%d\n", a);
	return 0;
}

在这里插入图片描述

6.逗号运算符

() , ()
逗号运算符的结果是后边表达式的结果。

int main()
{
	int num;
	num = ( 5 , 6 );
	printf("num=%d\n", num);
	return 0;
}

在这里插入图片描述

7.自增自减运算符

i++ , i–
运算符在变量的后面,在当前表达式中先用 i 的值,下条语句的时候 i 的值改变

#include<stdio.h>
int main()
{
	int num;
	int i = 3;
	int j = 7;
	num = i++;
	printf("num=%d\ti=%d\n", num, i);
	num = --j;
	printf("num=%d\tj=%d\n", num, j);
	return 0;
}

5eeceb44087899a24fb13877b96.png)

运算符的优先级及结合性

运算符优先级

在表达式中按照优先级先后进行运算,优先级高的先于优先级低的先运算。
优先级一样的按结合性来运算。

int a;
a = 2 + 5 + 3 * 4 - 6

运算符的结合性

左结合性:从左往右运算

int a;
a = 2 + 3 + 9 + 10;

右结合性:从右往左算

int a,b,c,d;
a = b = c = d = 100;

在这里插入图片描述
在这里插入图片描述
注:建议当表达式比较复杂的时候,用 ()括起来,括号的优先级最高,优先算括号里的。

<think>我们被要求回答关于C语言运算符优先级的问题,并且需要参考提供的引用内容。根据引用[1]和[2],我们可以整理出C语言运算符优先级顺序,并按照从高到低的顺序列出。 同时,我们还需要注意以下几点: 1. 行内数学表达式用$...$,但这个问题中可能涉及运算符,不需要数学表达式,但如果有表达式,我们会遵守规则。 2. 独立公式用$$...$$,但这里可能用不到。 3. 使用中文回答。 4. 生成相关问题。 5. 引用的内容末尾添加引用标识。 根据引用[1]和[2],我们可以整理出如下的优先级顺序(从高到低): 1. 非真正运算符:数组下标(如a[1])、函数调用(如func())、结构体成员选择符(如.和->) 2. 单目运算符:包括逻辑非(!)、按位取反(~)、自增(++)、自减(--)、负号(-)、类型转换((type))、解引用(*)、取地址(&)、sizeof 3. 双目运算符(按优先级从高到低): 算术运算符:乘法(*)、除法(/)、取模(%),加法(+)、减法(-) 移位运算符:左移(<<)、右移(>>) 关系运算符:小于(<)、小于等于(<=)、大于(>)、大于等于(>=),然后是等于(==)、不等于(!=) 位运算符:按位(&)、按位异或(^)、按位或(|) 逻辑运算符:逻辑(&&)、逻辑或(||) 4. 条件运算符(三目运算符)?: 5. 赋值运算符:包括=, +=, -=, *=, /=, %=, >>=, <<=, &=, ^=, |= 6. 逗号运算符:, 注意:引用[1]中提到“任何一个逻辑运算符优先级低于任何一个关系运算符”,这里的逻辑运算符指的是逻辑(&&)和逻辑或(||),关系运算符指的是<,<=,>,>=,==,!=。 我们将按照从高到低的顺序详细列出,并适当分组。 另外,引用[2]中详细列出了算术运算符,包括单目运算符中的正号(+)和负号(-),以及自增自减等。 在回答中,我们将引用这些内容,并在末尾添加引用标识。 同时,根据要求,我们需要在回答最后生成相关问题。 回答结构: 1. 首先概述C语言运算符优先级的重要性。 2. 然后按照优先级从高到低列出运算符,并分组说明。 3. 可以给出一些例子来说明优先级的影响。 4. 最后生成相关问题。 </think>### C语言运算符优先级详解 C语言运算符优先级决定了表达式中运算的执行顺序,这对正确理解程序逻辑至关重要。以下是按优先级从高到低的分类总结: 1. **非运算符的最高优先级元素** - 数组下标:`arr[index]` - 函数调用:`func()` - 成员访问:`.`(结构体)、`->`(指针) 2. **单目运算符**(从右向左结合) `!`(逻辑非)、`~`(按位取反)、`++`/`--`(自增/减)、`+`/`-`(正负号)、`(type)`(强制类型转换)、`*`(解引用)、`&`(取地址)、`sizeof` *例: `*ptr++` 等价于 `*(ptr++)`,先执行自增* 3. **双目运算符**(按优先级降序): - **算术运算符**(从左向右): `*`(乘)、`/`(除)、`%`(取模)→ `+`(加)、`-`(减) *例:`a + b * c` 等价于 `a + (b * c)`* - **移位运算符**(从左向右): `<<`(左移)、`>>`(右移) *例:`x << 2 + 1` 等价于 `x << (2 + 1)`* - **关系运算符**(从左向右): `<`、`<=`、`>`、`>=` → `==`(等于)、`!=`(不等于) *注:逻辑运算符优先级低于关系运算符[^1]* - **位运算符**(从左向右): `&`(按位)→ `^`(按位异或)→ `|`(按位或) - **逻辑运算符**(从左向右): `&&`(逻辑)→ `||`(逻辑或) 4. **三目运算符**(从右向左): `?:`(条件运算),如 `a > b ? a : b` 5. **赋值运算符**(从右向左): `=`、`+=`、`-=`、`*=`、`/=` 等 6. **逗号运算符**(从左向右): `,`(分隔表达式,返回最右值) #### 关键规则 - 单目运算符优先级高于所有双目运算符 - 算术运算 > 移位 > 关系 > 位运算 > 逻辑运算 - 赋值运算符优先级仅高于逗号运算符 - 括号 `()` 可显式改变优先级顺序 **示例分析**: `a & b != c` → 先执行 `b != c`(关系运算),再执行 `&`(位运算),等价于 `a & (b != c)`[^1][^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

oo0day

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

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

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

打赏作者

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

抵扣说明:

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

余额充值