引言:
hello,大家好!我是心跳sy,今天给大家分享c语言运算符详解,我们知道,c语言的一个显著特点就是表达式的应用,表达式是表示如何计算值的公式,而运算符又是构建表达式的基本工具,c语言拥有非常丰富的运算符,包括算术运算符、关系运算符、逻辑运算符、赋值运算符、位操作运算符、自增自减运算符、条件运算符、逗号运算符、指针运算符、求字节数运算符、强制类型转换运算符和特殊运算符。本文对每个运算符都进行了非常详细的解释,我们一起来看看吧~!!
💞心跳sy的C语言专栏💞⏪C语言知识点汇总到这了,有兴趣的友友可以点击订阅看看哟~
运算符详解目录
1、算术运算符(包括+,-,*,/,%)
·1. 算术运算符是包括c语言在内的多种编程语言中广泛应用的一种运算符,这类运算符可以执行加法、减法、乘法、除法以及求余。
·2. 加法类和乘法类运算符都属于二元运算符,需要两个操作数,一元运算符只需要一个操作数:i=+1; i=-1; (通常+什么都不做)
*3.需要注意的是除了%运算符外,其他二元算术运算符既允许操作数是整数,也允许操作数是浮点数,两者混合也是可以的。取余运算符%要求操作数是整数,如果两个数有一个不是整数,编译无法通过。
*4.运算符‘/’当两个操作数都是整数时,运算符‘/’会丢掉分数部分来截取结果。因此1/2的结果是0而不是0.5。
//当int型操作数和float型操作数混合在一起时,运算结果是float型的
int a = 7;
float b = 3.5;
printf("%f\n", a + b);
printf("%f\n", a/b);
2、关系运算符(包括>,<,==,>=,<=,!=)
·1. c语言表达式产生的结果是0(假)或1(真),例如3<5表达式的值为1,而3>5的值为0;关系运算符同样适用于比较浮点数,也允许比较混合型操作数,如:1<2.5的值为1;
·2. 关系运算符的优先级低于算术运算符,例如:表达式 i+j<k-1的意思是(i+j)<(k-1).关系运算符是左结合性的。
*3.注意:i<j<k在c语言中是合法的,但该表达式不是测试j是否位于i和k之间(正确表达式:i<j&&j<k),因为<运算符是左结合的,所以表达式等价于(i<j)<k,换句话说是先检测i是否小于j,然后用比较产生的结果(1或0)来和k进行比较。
*4.注意:“等于”是两个紧邻的=,而不是一个=,值得注意的是,==和!=运算符的优先级低于大于小于等关系运算符。
3、逻辑运算符(!,&&,||)
·1. !,&&,||分别是逻辑非、逻辑与、逻辑或(其中 !是一元运算符,&&、||是二元运算符)逻辑运算符产生的结果是0或1,将任何非零值操作数作为真值来处理,将任何零值作为假值来处理规则如下:
·2.如果表达式的值为0,那么!表达式 的结果为1;
·3.如果 表达式1和表达式2 的值都是非零值,那么 表达式1&&表达式2 的结果为1;
·4.如果 表达式1或表达式2 的值中任意一个是(或者都是)非零值,那么 表达式1||表达式2 的结果为1。
*5.运算符&&和||都对操作数进行“短路”计算,先计算出左值,再计算右值,如果表达式的值可以仅由左操作数的值推导出来,则不用计算右值;例如:(i != 0)&& (i/j> 0),如果i不等于零,则计算右值,如果i等于零,就不需要计算了
*6.运算符!是右结合的,&&和||为左结合的。
4、赋值运算符(=,+=,-=,*=,/=,%=,&=,|=,^=,>>=,<<=)
·1.表达式 a=b(b可以是常量、变量或更复杂的表达式);如果a和b的类型不同,那么赋值运算发生时会把b的值转换为a的类型。
例如:int i = 0;
i = 6.66f //此时 i 为6。
·2.赋值运算符可以多个赋值进行串联,例如:i = j = k = 0;
·3.运算符 = 是右结合的,因此上述表达式等价于i =(j =(k = 0));
·4.赋值运算符要求它的左操作数为左值,左值表示对象,而不是常量或计算的结果,变量是左值,而10或 2*i 这样的表达式不是左值。
·5.复合赋值:i += 2;等价于i = i + 2;
5、位操作运算符(<<,>>,~,&,^,|)
·1.移位运算符包括左移位(<<)和右移位(>>),它可以将整数的二进制位进行左移右移,它们的操作数可以是任意整数类型(包括char),移位运算符对两个操作数都会进行整数提升,返回值类型是左操作数提升后的类型。
·2.i << j的值是将 i 中的二进制位左移j位后的结果,每次从 i 的最左端溢出一位,在 i 的最右端补一个0位;i >> j的值是将 i 中的二进制位右移 j 位后的结果。
·3.需要注意的是右移操作符分为算术右移和逻辑右移两种,算术右移:右边舍去,左边补原符号位,原符号位为0就补0,为1就补1;逻辑右移:右边舍去,左边直接补0.
·4.移位操作符优先级比算术运算符优先级低,i << 2+1等价于i <<(2+1)
·5.~,&,^,|分别为按位取反、按位与、按位异或、按位或。其中 ~是一元运算符,其他为二元运算符, ~是对操作数每一位取反,即将每一个1替换为0,将0替换为1;&对两个操作数相应的位执行逻辑与运算,运算符^和|相似(都是对两个操作数执行逻辑或运算),不同的是,当两个操作数的为都是1时, ^产生0而|产生1。
6、自增自减运算符(++,- -)
·“自增”(加1)“自减”(减1),++,- -运算符既可以作为前缀(++i,- -i),也可以作为后缀(i++,i- -),前缀是在使用之前就自增1,后缀是先使用完后增1
int i = 1;
printf("i is %d\n", ++i);
printf("i is %d\n", i);
int j = 1;
printf("j is %d\n", j++);
printf("j is %d\n", j);
7、条件运算符( ?:)
· 条件表达式:表达式1?表达式2:表达式3,它是c语言运算符唯一一个三目运算符。这个表达式可以解释为:如果表达式1成立,那么执行表达式2,否则执行表达式3。
*注意:除赋值运算符以外,条件运算符的优先级低于其他所有运算符。
8、逗号运算符( ,,)
·1.逗号表达式:表达式1,表达式2,逗号表达式的值要通过两步实现,第一步,计算表达式1的值,第二步,计算表达式2的值,把这个值作为整个表达式的值。
·2. 需要注意的是,表达式1的值并不是完全抛弃,如果表达式1的结果对表达式2有影响,那么其值仍然起作用,只是最终值为表达式2的值。
9、指针运算符(&,*)
·1.如果要找到变量的地址,可以使用 &(取地址运算符),如果x是变量,那么&x就是x在内存中的地址。为了获得对指针所指向对象的访问,可以使用 *(间接寻址运算符),如果p是指针,*p则表示p当前指向的对象。
·2.在初始化指针变量时,使用&运算符把某个变量的地址赋给它。例如:
int i,j, * p;//方法一
p = &i;
int* pa = &j;//方法二
· 而一旦指针变量指向了对象,就可以使用*运算符访问存储在对象中的内容。例如,如果p指向 i,那么可以显示出 i 的值,例如:
printf("%d\n", *p);
10、求字节数运算符(sizeof运算符)
·1.sizeof 表达式:sizeof(类型名),sizeof 运算符允许程序获取储存指定类型的值所需要的空间,其值是一个无符号整数,代表存储属于 类型名 的值所需要的字节数。表达式sizeof(char)的值为1,编译器本身通常就能够确定 sizeof 表达式的值。
·2.显示 sizeof 值时要注意,sizeof 表达式的类型为 size_t,size_t一定是无符号整形,C99中 printf 可以直接显示出 size_t 的类型值而不需要强制转换。
printf("Size of int:%zd", sizeof(int));//输出:Size of int:4
11、强制类型转换运算符((类型名))
· c语言把(类型名)视为一元运算符,一元运算符的优先级高于二元运算符,(unsigned int)time(NULL),(unsigned int)即为强制类型转换。
12、特殊运算符([ ],——>,. ,())
·1.[ ]是数组下标索引运算符,可以获取数组中单独的元素,下表运算符需要两个操作数,一个操作数是数组名称,另一个是一个整数。
·2.——>运算符和 . 运算符在结构体访问成员变量时经常用到。当Print函数中传入对象b的地址,print函数实现时用结构体指针接收,打印时用——>指向成员变量。当不传入地址时,也可以直接用成员访问操作符 . 来访问。
·3.函数名(形参表),它最少需要1个操作数,函数名称,参数列表可以根据用户需求进行设置。
struct Student
{
char name[20];
int age;
};
void Print(struct Student* pb)
{
printf("%s %d\n", pb->name, pb->age);
}
int main()
{
struct Student b = {"小明", 20};
printf("%s %d\n", b.name, b.age);
Print(&b);
return 0;
}
13、附:操作符优先级表
感谢各位友友们阅读,欢迎各位大佬在评论区留言哦~!!!