【C语言】操作符,看这一篇就够了

目录

前言:

一,操作符分类

二, 操作符详解

1,算术操作符

2,移位操作符

2.1左移操作符

2.2右移操作符

移位规则:

3,位操作符

4,赋值操作符

5,单目操作符

6,关系操作符

7,逻辑操作符

8,条件操作符

9,下标引用,函数调用和结构成员



前言:

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;
}
   

好了,到了这里就结束了,希望大家能有收获。

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不会背雨霖铃

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

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

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

打赏作者

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

抵扣说明:

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

余额充值