目录
前言:
C语言的操作符也挺多的,很多时候我们要用到的时候,总有那一两个在我们脑中很模糊,为此,我直接写一篇C语言涉及的操作符的合集来解决这个问题,希望这篇能对于老手能再加深印象,对于新手算是一次成长。好了,话不多说,来一张美图,直接开始。
一,操作符分类
算术操作符: +(加) -(减) *(乘) /(除) %(求余)
移位操作符: <<(左移操作符) >>(右移操作符)
位操作符: &(按位与) | (按位或) ^(按位异或)
赋值操作符: =
单目操作符: !(逻辑反操作) -(负) +(正) &(取地 址) sizeof(求类型长度) ~ (按位取反) --(前置,后置减减) ++(前置,后置加加) *(间接访问操作符,解引用操作符) (类型)强制类型转换
关系操作符: > >= < <= !=(不相等) ==(相等)
逻辑操作符: &&(逻辑与) ||(逻辑或)
条件操作符: exp1 ? exp2 : exp3
逗号表达式: exp1,exp2,exp3,exp4……
下标引用,函数调用和结构成员: [ ](下标引用操作符) ( )(函数调用操作符) .(结构体.成员名) ->(结构体-> 成员名)
二, 操作符详解
1,算术操作符
算术操作符: +(加) -(减) *(乘) /(除) %(求余)
1,除了%操作符之外,其他的几个操作符可以用于整数和浮点数。
2,对于 / 操作符如果两个操作符都为整数,执行整数除法,只要有浮点数执行的是浮点数除法。
3,% 操作符的两个操作符必须为整数,返回的是整数之后的余数。
2,移位操作符
移位操作符: <<(左移操作符) >>(右移操作符)
注:移位操作符的操作数只能是整数。
2.1左移操作符
移位规则:左边抛弃,右边补0。
注:i 在未被赋值的情况下,移位时自身的值不变。
2.2右移操作符
移位规则:
1,逻辑移位:左边用0表示,右边丢弃。
2,算术移位:左边用该值的符号位补充,右边丢弃。
注意:
对于移位操作符,不要移动负数位,这个标准是C语言未定义的。
例如:
int i = 10;
num >> -1; //错误
3,位操作符
位操作符: &(按位与) | (按位或) ^(按位异或)
注:他们的操作数必须是整数。
& : 按照整数的二进制补码的每个位进行逻辑与操作,如果相比较的位有一个为0,那么结果为0,只有全为1时为1;
| : 按照整数的二进制补码的每个位进行逻辑或操作,如果相比较的位位有一个为1,那么结果为1,只有全为0时为0;
^ : 按照整数的二进制补码的每个位进行逻辑异或操作,如果相比较的位位相同为 1,相比较的位位不相同为 0;
4,赋值操作符
赋值操作符: =
这个可以把你的变量重新变为一个满意的值,例如:
int weight = 120; //这个值不满意
weight = 55; //变为自己满意的值
int height = 175; //这个值不满意
height = 190; //变为自己满意的值
还可以连续赋值,只不过可读性不是太好,例如:
int i = 2;
int j = 3;
int num = i = j + 1;//连续赋值,num 和 i 都为 4
还可以复合运算:
*= // i += 2 等同于:i = i + 2;
-= // i -= 2 等同于:i = i - 2;
*= // i *= 2 等同于:i = i * 2;
/= // i /= 2 等同于:i = i / 2;
%= // i %= 2 等同于:i = i % 2;
>>= // i >>= 2 等同于:i = i >> 2;
<<= // i <<= 2 等同于:i = i << 2;
&= // i &&= 2 等同于:i = i && 2;
|= // i |= 2 等同于:i = i | 2;
^= // i ^= 2 等同于:i = i ^ 2;
5,单目操作符
单目操作符: !(逻辑反操作) -(负) +(正) &(取地 址) sizeof(求类型长度) ~ (按位取反) --(前置,后置减减) ++(前置,后置加加) *(间接访问操作符,解引用操作符) (类型)强制类型转换
这里太简单的我就不细讲了,有的需要靠例子来理解
!(逻辑反操作):
如果表达式的值为0,那么!表达式的结果为1。例如:
int i = 1;
if ( !i ) //这里i前面加上了!,表示0;不会打印
{
printf("haha!\n);
}
&(取地址操作符):
取出操作数的地址。例如:
int i = 0;
scanf("%d", &i); //将输入的数存到i的地址中
printf("%x", &i); //用十六进制输出i的地址
int *ps = &i; //将i的地址存储的指针ps中
printf("%d\n",*ps); //打印出i的值。
sizeof(操作数类型长度,以字节为单位)
补充个小知识:
很多时候容易把sizeof当成函数,sizeof是32个关键字之一,不是函数。另外,define不是关键字,是编译器实现的,用来定义宏的预处理指令,不是C语言的内容。C语言关键字:C语言定义的,具有特定含义,专门用于特殊用途的C语言标识符,也称为保留字。
实例:
char a = 0;
int b = 0;
double c = 0;
float d = 0;
int arr[10] = { 0 };
printf("%d\n", sizeof(a));//结果是:1;
printf("%d\n", sizeof(b));//结果是:4;
printf("%d\n", sizeof(c));//结果是:8;
printf("%d\n", sizeof(d));//结果是:4;
printf("%d\n",sizeof(arr));//结果是:40;(数组arr里有10个int型的数,返回的是占用的空间:10*4 = 40)
6,关系操作符
关系操作符: > >= < <= !=(不相等) ==(相等)
这里功能跟数学符号一样,只是写法不同。如下:
注意:在编程的过程中=和==不小心写错,引发的程序错误。
7,逻辑操作符
逻辑操作符: &&(逻辑与) ||(逻辑或)
&& : 如果表达式1和表达式2的值都是非零值,那么表达式1 && 表达式2的结果为1
||: 如果表达式1和表达式2的值中任意一个是(或者两个都是)非零值,那么表达式2的结果为1
注意:1,不要与&和 | 搞混。
2,“短路”计算。
“短路”计算:如果表达式的值可以仅由左操作数的值推导出来,那么将不再计算右表达式的值。例:
(i != 0) && (j / i > 0) //如果i不等于0,则需要计算表达式(j / i > 0)的值。如果等于0,则整个表达式一定为假,所以不需要计算表达式(j / i > 0)的值了
8,条件操作符
条件操作符: exp1 ? exp2 : exp3
如果exp1为真,则计算exp2的值,如果为假,则计算exp2的值。
if( a > 5)
b = -3;
else
b = 3;
//以上等价于;(a > 5) ? -3 : 3
逗号表达式
逗号表达式: exp1,exp2,exp3,exp4……
逗号表达式: 就是用逗号把多个表达式隔开。从左到右依次执行。整个表达式的结果是最后一个表达式的结果。例:
int i = 1;
int b = 2;
int c = 3;
int d = (i > b, i = i + 200, b *= c, c = c + 3);//d的结果是最后c + 3 的结果。
printf("%d\n", d);// 6
printf("%d\n", c);//6
printf("%d\n", i);//201
9,下标引用,函数调用和结构成员
下标引用,函数调用和结构成员: [ ](下标引用操作符) ( )(函数调用操作符) .(结构体.成员名) ->(结构体-> 成员名)
[ ](下标引用操作符) : 操作数:一个数组名 + 一个索引值
int arr[10]; //创建数组
arr[9] = 10; //使用下标引用操作符
// [ ] 的两个操作数是 arr 和 9
( )(函数调用操作符): 接受一个或多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。
#include<stdio.h>
void test()
{
printf("hahaha\n");
}
void test2(const char *str)
{
printf("%s\n", str);
}
int main()
{
test(); // 用()作为函数调用操作符
test("hehehe"); // 用()作为函数调用操作符
return 0;
}
访问一个结构的成员
.(结构体变量 . 成员名) ->(结构体指针 -> 成员名)
这个是结构体专门访问结构成员来使用的,有上面两种格式。
区别是一个用在结构体变量中,一个用在结构体指针中。
例如:
struct stu
{
int age;
char name[20];
int weight;
}stu;
int main()
{
struct stu s1= { 11 , "张三", 19 };
struct stu *s2 = &s1; // ->用在结构体地址中
printf("s1的年龄是%d岁,名字是%s, 体重是%d千克\n", s1.age, s1.name, s1.weight); //(结构体变量 . 成员名)应用实例
printf("s2的年龄是%d岁,名字是%s, 体重是%d千克\n", s2->age, s2->name, s2->weight);//(结构体指针 -> 成员名)应用实例
return 0;
}
好了,到了这里就结束了,希望大家能有收获。