目录
引言
c语言提供了13种类型的运算符
一、算术运算符(+、-、*、/、%)
C语言中为了方便运算,提供了⼀系列操作符,其中有⼀组操作符叫:算术操作符。分别是: + - * / % ,这些操作符都是双目操作符。
注:
- 操作符也被叫做:运算符,是不同的翻译,意思是⼀样的。
- 双目操作符:有2个操作数(操作数就是位于操作符两端用于运算)。
最后会给总结优先级和单目双目和三目操作符的分类。
1.1 +、-和*(乘法)
由于这个比较简单,没有什么特别注意的,直接看例子
#include<stdio.h>
int main()
{
int x = 5 + 20;
int y = 63 - 19;
int z = 4 * 25;
printf("%d\n", x);
printf("%d\n", y);
printf("%d\n", z);
return 0;
}
1.2 /(除法)
运算符 / ⽤来完成除法。
注意:
- 除号的两端如果是整数,执行的是整数除法,得到的结果也是整数。原因就是 C 语言里面的整数除法是整除,只会返回整数部分,丢弃小数部分。
- 两个运算数必须至少有⼀个浮点数,这时 C语言就会就行浮点数除法。或者使用强制类型转换,二者输出的效果是一样的。
int main()
{
float x = 6 / 4;
int y = 6 / 4;
int z = 6;
printf("%f\n", x); // 输出 1.000000,这里由于x是float类型的所以会有小数
printf("%d\n", y); // 输出 1
printf("%f\n", (float)z / 4);
printf("%f\n", 6.0 / 4);
return 0;
}
1.3 %(取模也就是取余)
运算符 % 表示求模运算,即返回两个整数相除的余值。这个运算符只能用于整数,不能用于浮点数。
注意:负数求模的规则是,结果的正负号由第⼀个运算数的正负号决定
#include <stdio.h>
int main()
{
printf("%d\n", 11 % -5); // 1
printf("%d\n", -11 % -5); // -1
printf("%d\n", -11 % 5); // -1
printf("%d\n", 11 % 5);// 1
return 0;
}
二、关系运算符(> < >= <= == != )
C 语言用于比较的表达式,称为 “关系表达式”(relational expression),里面使用的运算符就称 为“关系运算符”(relational operator),主要有下面6个。
- > ⼤于运算符
- < 小于运算符
- >= 大于等于运算符
- <= 小于等于运算符
- == 相等运算符
- != 不相等运算符
关系表达式通常返回 0 或 1 ,表示真假。 C 语言中, 0 表示假,所有非零值表示真。
注意:
- 相等运算符 == 与赋值运算符 = 是两个不⼀样的运算符,因此为了防止写错,我们通常将3==x,变量写在右边
- 多个关系运算符不宜连用。这是因为关系运算符返回是真假,也就是0或者1(非零的数)
例如:i<j<k,i<j如果成立会返回非零的数也就是1,和我们所考虑的不同,因此我们应该用逻辑运算符,i<j && j<k 这样修改。我们会在逻辑运算符详细讲解&& || !
下面是一个例子
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age>=18 && age<=36){
printf("⻘年\n");
}
return 0;
}
三、逻辑运算符(&& , || , !)
在C语言中,逻辑运算符用于执行布尔逻辑运算。以下是C语言中的逻辑运算符:
-
逻辑与运算符 (
&&
):- 语法:
表达式1 && 表达式2
- 描述:如果表达式1和表达式2都为真(非零),则整个表达式的值为真(非零);否则,结果为假(0)。
- 语法:
-
逻辑或运算符 (
||
):- 语法:
表达式1 || 表达式2
- 描述:如果表达式1或表达式2至少有一个为真(非零),则整个表达式的值为真(非零);如果两者都为假(0),则结果为假(0)。
- 语法:
-
逻辑非运算符 (
!
):- 语法:
!表达式
- 描述:如果表达式为真(非零),则
!表达式
的值为假(0);如果表达式为假(0),则!表达式
的值为真(非零)。
- 语法:
注意:
- &&是一假则假,||是一真则真。&&与||的优先级是相同的(但比关系运算符低,以后会在条件判断时使用),!优先级比前两者高,这一点也需要注意
- && 与||都是双目运算符,!单目运算符
下面来做一个练习:闰年的判断
输⼊⼀个年份year,判断year是否是闰年
闰年判断的规则: 1. 能被4整除并且不能被100整除是闰年 2. 能被400整除是闰年
#include <stdio.h>
int main()
{
int year = 0;
scanf("%d", &year);
if (year % 4 == 0 && year % 100 != 0)
printf("是闰年\n");
else if (year % 400 == 0)
printf("是闰年\n");
return 0;
}
#include <stdio.h>
int main()
{
int year = 0;
scanf("%d", &year);
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
printf("是闰年\n");
return 0;
}
注意:C语言逻辑运算符还有⼀个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是保证的。 如果左边的表达式满足逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”。
像这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进行计算的运算称为短 路求值。
下面做个练习:
#include <stdio.h>
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ && ++b && d++;
printf("a = %d b = %d c = %d d = %d\n", a, b, c, d);
i = a++||++b||d++;
printf("a = %d b = %d c = %d d = %d\n", a, b, c, d);
return 0;
}
四、位运算
位运算是C语言中一组用于对整数类型的二进制位进行操作的运算符。这些运算符直接处理二进制表示的数据,通常在底层编程、优化算法和系统级编程中使用。以下是C语言中常见的位运算符:
-
按位与(&):
- 语法:
a & b
- 描述:按位与运算符对两个操作数的每一位执行逻辑与操作,如果两个对应位都是1,则结果位为1;否则,结果位为0。
- 语法:
-
按位或(|):
- 语法:
a | b
- 描述:按位或运算符对两个操作数的每一位执行逻辑或操作,如果两个对应位至少有一个是1,则结果位为1;否则,结果位为0。
- 语法:
-
按位异或(^):
- 语法:
a ^ b
- 描述:按位异或运算符对两个操作数的每一位执行逻辑异或操作,如果两个对应位不同,则结果位为1;如果两个对应位相同,则结果位为0。
- 语法:
-
按位取反(~):
- 语法:
~a
- 描述:按位取反运算符对操作数的每一位执行逻辑取反操作,将1变为0,将0变为1。
- 语法:
-
左移(<<):
- 语法:
a << b
- 描述:左移运算符将操作数的所有位向左移动b位,右侧空出的位用0填充,相当于将操作数乘以2的b次方。
- 语法:
-
右移(
>>
):- 语法:
a >> b
- 描述:右移运算符将操作数的所有位向右移动b位,左侧空出的位用符号位(对于有符号数)或0(对于无符号数)填充,相当于将操作数除以2的b次方。
- 语法:
五、赋值运算符(=和复合赋值)
在变量创建的时候给⼀个初始值叫初始化,在变量创建好后,再给⼀个值,这叫赋值
赋值操作符 = 是⼀个随时可以给变量赋值的操作符。
int a = 100;//初始化
a = 200;//赋值,这⾥使⽤的就是赋值操作符
六、条件运算符(三目运算符)
条件操作符也叫三目操作符,需要接受三个操作数的,形式如下:
1 exp1 ? exp2 : exp3
条件操作符的计算逻辑是:如果 exp1 为真, exp2 计算,计算的结果是整个表达式的结果;如果 exp1 为假, exp3 计算,计算的结果是整个表达式的结果。
练习:使用条件表达式实现找两个数中较大值
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
int m = a>b ? a : b;
printf("%d\n", m);
return 0;
}
七、逗号运算符(,)
逗号运算符是C语言中的一种运算符,它允许在表达式中使用多个子表达式,并按照从左到右的顺序依次求值。逗号运算符具有低优先级,因此它通常用于更复杂的表达式中,以确保正确的运算顺序。逗号运算符的一般形式如下:
表达式1, 表达式2, ..., 表达式n
注意:
-
从左到右求值: 逗号运算符的子表达式按照从左到右的顺序进行求值。每个子表达式的值都被计算,但只有最后一个子表达式的值成为整个逗号表达式的值。
-
返回最后一个子表达式的值: 逗号运算符的值是其最后一个子表达式的值。
下面来看一个例子:
#include <stdio.h>
int main() {
int a = 5, b = 10, c;
// 逗号运算符在赋值语句中
c = (a++, b++, a + b);
printf("a = %d, b = %d, c = %d\n", a, b, c);
return 0;
}
八、指针运算符
在C语言中,指针是一种特殊类型的变量,其存储的值是另一个变量的地址。指针运算符用于处理指针,使程序能够更直接地访问和修改内存中的数据。以下是C语言中常见的指针运算符:
取地址运算符 &
:
- 语法:
&variable
- 描述:
&
运算符用于获取变量的地址。例如,&x
表示变量x
的地址。
int x = 10;
int *ptr = &x; // ptr现在包含变量x的地址
间接引用运算符(或解引用运算符) *
:
- 语法:
*pointer
- 描述:
*
运算符用于访问指针指向的地址上存储的值。例如,*ptr
表示指针ptr
指向的变量的值。
int y = *ptr; // y现在包含ptr指向的变量x的值
指针运算(加法和减法):
- 语法:
pointer + offset
或pointer - offset
- 描述:指针可以进行算术运算,其中
offset
表示要移动的元素数。例如,ptr + 1
表示指向下一个元素的指针,而ptr - 1
表示指向前一个元素的指针。
int array[] = {1, 2, 3, 4, 5};
int *p = &array[2]; // p指向数组的第三个元素
int value = *p; // value = 3
int nextValue = *(p + 1); // nextValue = 4
箭头运算符 ->
:
- 语法:
pointer->member
- 描述:当使用指向结构体的指针时,箭头运算符用于访问结构体成员。相当于
(*pointer).member
struct Point {
int x;
int y;
};
struct Point p1 = {5, 10};
struct Point *ptr_p1 = &p1;
int x_value = ptr_p1->x; // x_value = 5
数组下标运算符 []
:
- 语法:
pointer[index]
- 描述:当使用指向数组的指针时,可以使用数组下标运算符来访问数组元素。
int array[] = {1, 2, 3, 4, 5};
int *p = &array[2];
int value = p[1]; // value = 4
这些指针运算符是C语言中处理指针的基本工具,它们允许对内存进行更灵活和直接的操作。在使用指针时,要小心确保不会访问未分配的内存,以避免出现未定义行为和程序崩溃。
九、求字节运算符
sizeof 是⼀个关键字,也是操作符,专门是用来计算sizeof的操作符数的类型长度的,单位是字 节。sizeof 操作符的操作数可以是类型,也可是变量或者表达式。
注意:
- sizeof 的操作数如果不是类型,是表达式的时候,可以省略掉后边的括号的。
- sizeof 后边的表达式是不真实参与运算的,根据表达式的类型来得出⼤⼩。
- sizeof 的计算结果是 size_t 类型的。用%zd来返回size_t的数据类型。
十、强制类型转换运算符
强制类型转换运算符 (type)
:
- 语法:
(type) expression
- 描述:这种形式的强制类型转换运算符允许将表达式的值强制转换为指定的数据类型。在
(type)
中,type 是目标数据类型,expression 是要转换的表达式。
例如,将一个整数转换为浮点数:
int a = 10;
float b = (float)a;