C语言操作符

本文详细介绍了C语言中的各类运算符,包括算术运算符、移位运算符、位运算符、赋值运算符等,并通过示例代码展示了它们的具体应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.算术操作符
+:加法
-:减法
*:乘法
/:除法
%:求余(模)

注意:
①模(%)运算时,两个操作数必须为整数;其他的几个操作符可以用作于整数和浮点数。

int main()
{
    int a = 10;
    printf("%d\n",a%3.0);//error
    return 0;
}

②除法(/)运算时,两个操作数只要有一个为浮点数,则为浮点数除法。操作数都为整数时,则为整数除法。
2.移位操作符
注意:
①内存里存的是二进制序列的补码,最高位是符号位,0表示正数,1表示负数;
②移位移的是二进制位;
③移位不能移负数位,例如a>>-1;
④移位操作符不用于浮点数;
⑤移位操作数如果不给自己赋值是不会改变自己的。a>>1;****a = a>>1;

(1)左移操作符:<<
左移一位有乘2的效果,一位是2的一次方
这里写有乘2的效果图片描述
(2)右移操作符:>>
这里写图片描述
大部分编译器是算术移位。
3.位操作符
按位与:&
按位或:|
按位异或:^
(1)&
两个都为1则为1;只要有一个0则为0;
按位与的特点:
任何一个数字a跟1按位与,得到的结果如果为1,说明这个数字a最低位为1,若结果为0,说明最低位为0。

int main()
{
    int a = 15;
    a&1
    //0000000000000000000000000000001111
    //0000000000000000000000000000000001
    //0000000000000000000000000000000001--1

    printf("%d\n", a);
    return 0;
}

(2)|
有一个1则为1。
(3)^
相同为0,相异为1。

int main()
{
    int a = -1;
    int b = 10;
    int c = a^b;
    //11111111111111111111111111111111——a的补码
    //00000000000000000000000000001010——b的补码
    //11111111111111111111111111110101——异或结果c(补码)
    //11111111111111111111111111110100——减一
    //10000000000000000000000000001011——取反得到原码
    printf("%d\n", c);//-11
    return 0;
}

按位异或特点:
①a与a异或=0;
②任何一个数与0异或等于其自身。

4.赋值操作符
(1) =
赋值操作符可以连续使用,比如:a = x = y+1;但不清晰爽朗。
写成以下形式更好:


x = y+1;
a = x;

(2)复合赋值符
①+= ②-= ③*= ④/= ⑤ %=⑥ <<= ⑦>>= ⑧&= ⑨|= ⑩^=
用法都如下:
a = a+10;
a += 10;
5.单目操作符
(1)逻辑反操作: !
真变假,假变真。

int main()
{
    int flag = 10;
    printf("%d\n", !flag);//!flag为假 输出0
    return 0;
}

(2)负值: -
(3)正值: +
(4)取地址: &
①取变量地址

int main()
{
    int a = 10;
    printf("%p\n", &a);//%p打印地址
    return 0;
}

②取数组地址
(数组名就是地址)

int main()
{
    int arr[10] = {0};
    printf("%p\n", arr);//数组名相当于首元素的地址
    printf("%p\n", arr+1);//取出下一个元素的地址

    printf("%p\n", &arr);//&数组名--取出的是数组的地址
    printf("%p\n", &arr+1);//取出下一个数组的地址
    return 0;
}

这里写图片描述
③函数地址
&函数名

void test()
{
    printf("hehe\n");
}

int main()
{
    printf("%p\n", &test);
    return 0;
}

(5)操作数的类型长度: sizeof
①sizeof内部的表达式不参与运算,不计算。


int main()
{
    short s = 10;
    int a = 6;

    printf("%d\n", sizeof(s=a+8));//2;a+8放到s这,就得按照s的类型
    printf("%d\n", a);//  6
    printf("%d\n", s);// 10;sizeof里面的表达式不计算
    return 0;
}

int main()
{
    int a  = 10;//变量名去掉后,剩下的就是类型,int是a的类型
    int arr[10] = {0};//int [10] 是arr的类型

    printf("%d\n", sizeof a);//4
    printf("%d\n", sizeof int);//error

    printf("%d\n", sizeof(a));//4
    printf("%d\n", sizeof(int));//4
    printf("%d\n", sizeof(arr));//40
    printf("%d\n", sizeof(int [10]));//40

    return 0;
}

(6)对一个数的二进制按位取反: ~
每位都取反,1变0,0变1

int main()
{
    printf("%d\n", ~10);
    //00000000000000000000000000001010 --10补码
    //11111111111111111111111111110101--按位取反(补码)
    //10000000000000000000000000001010--反码
    //10000000000000000000000000001011--原码
    return 0;
}

(7)前置、后置减减: –
前置:先加后用
后置:先用后加
(8)前置、后置加加: ++
(9)间接访问操作符(解引用): *


int main()
{
    int a = 10;
    int * p = &a;//这里的*是指针类型
    *p = 20;//这个*是解引用操作符
    return 0;
}

(10)强制类型转换: (类型)
注意:
①强制类型转换可以,但不推荐;
②括号是给类型带,不能给数字带。

 int main()
{
    int a = 3.14;//有警告
    int a = (int)3.14;// √
    int a = int(3.14);//error
    return 0;
}

6.关系操作符
(1)>
(2)>=
(3)<
(4)<=
(5)!=
(6)==
注意 == 不能用来判断两个字符串是否相等,应使用strcmp();
7.逻辑操作符
(1)逻辑与: &&
只要两个操作数有一个为假则为假;同时为真才为真
注意:当第一个表达式为0时,后面的表达式就不算,不执行了
(2)逻辑或: | |
有一个为真则为真;两个同时为假才为假
注意:当第一个表达式为1时,后面的表达式就不算,不执行了

int main()
{
    int i = 0,a=0,b=2,c =3,d=4;
    i = a++ && ++b && d++;
    //i = a++||++b||d++;
    printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);//1 2 3 4

    return 0;
}

8.条件操作符
exp1 ? exp2 : exp3
当exp1为真时执行exp2;当exp1为假时执行exp3

9.逗号表达式
逗号表达式就是用逗号隔开的多个表达式,从左向右依次执行,整个表达式的结果是最后一个表达式的结果。

int main()
{
    int a = 1;
    int b = 2;
    int c = (a > b,a = b+10,a,b = a+1)
    printf("%d\n",c);//13
    return 0;
}

10.下标引用、函数调用和结构成员
(1)下标引用: [ ]
两个操作数;比如 arr [4],arr是一个,4是一个

int main()
{
    int arr[10] = {1,2,3,4,5,6,7,8,9,0};
    printf("%d\n", arr[4]);//5
    printf("%d\n", *(arr+4));//5
    printf("%d\n", *(4+arr));//5
    printf("%d\n", 4[arr]);//5

    return 0;
}

(2)函数调用
函数名();
最少有一个操作数,即为它的函数名。
(3)结构成员
访问一个结构的成员;
①.结构体.成员名

struct Stu   //是一个类型,不占用空间
{
    //学生的属性
    char name[20];
    int age;
    float score;
};
int main()
{
    struct Stu s;//创建一个学生类型的变量,s占空间
    //s.name = "zhangsan";//error,应该写成以下形式
    strcpy(s.name, "zhangsan");//字符串拷贝
    s.age = 20;
    s.score = 55.0f;
    printf("%s %d %f\n", s.name, s.age, s.score);
    return 0;
}

②->结构体指针->成员名

struct Stu
{
    char name[20];
    int age;
    float score;
};
int main()
{
    struct Stu s;
    struct Stu* ps = &s;
    strcpy(s.name, "zhangsan");
    s.age = 20;
    s.score = 55.0f;
    //printf("%s %d %f\n", (*ps).name, (*ps).age, (*ps).score);
    printf("%s %d %f\n", ps->name, ps->age, ps->score);

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值