操作符详解

1.算术操作符

%

%取模(余),计算的是整除之后的余数,取模操作的两边操作数只能是整数

#include<stdio.h>

int main()
{
    int num= 10 % 3;
   
    printf("num1=%d\n", num);

    return 0; 
}

思考:如何随机生成一个1-100的数?

/

除号,如果操作符的两个操作数都为整数,那么就执行整数除法。如果想让结果保留小数,除号的两端至少有一个操作数是浮点数。

#include<stdio.h>

int main()
{
    int num1 = 10 / 3;
    double num2 = 10.0 / 3;
    printf("num1=%d\n", num1);
    printf("num2=%.1lf\n", num2);

    return 0; 
}

2.移位操作符

关于二进制

整数的二进制表示形式,分为三种(原码、反码、补码)

原码就是按照一个数的正负,直接写出它的二进制表示形式得到的就是原码,值得注意的是,原码的最高位(最前面的那一位)是符号位,0表示正数,1表示负数。正数的原码、反码、补码是相同的,而负数的反码、补码要经过计算的。

反码:符号位不变,其他位按位取反,就是反码

补码:反码+1

举例:

a=10

a的原码、反码、补码都是00000000000000000000000000001010

b=-10

b的原码10000000000000000000000000001010

b的反码11111111111111111111111111110101

b的补码11111111111111111111111111110110

参与移位的时候,移动的都是补码,printf的时候是原码

<< 左移操作符

移位规则:左边抛弃、右边补0

#include<stdio.h>

int main()
{
    int num1 = 10;
    int num2 = num1 << 1;
    printf("num1=%d\n", num1);
    printf("num2=%d\n", num2);

    return 0; 
}

>> 右移操作符     

移位规则: 

第一种:逻辑移位:左边用0填充,右边丢弃 

第二种:算术移位:左边用原该值的符号位填充,右边丢弃

(大多数编译器用的都是算术移位)

#include<stdio.h>

int main()
{
    int num1 = -1;
    int num2 = num1 >> 1;
    printf("num1=%d\n", num1);
    printf("num2=%d\n", num2);

    return 0; 
}

注:移位操作符的操作数只能是整数,且移位操作符移的是二进制位表示形式的整数。

警告:对于移位运算符,不要移动负数位,这个是未定义的。

3.位操作符

& | ^

& 按位与-按二进制位与,对应的二进制位有0则为0,两个同时为1,才为1

|  按位或-按二进制位或,对应的二进制位有1则为1,两个同时为0,才为0

^  按位异或 -对应的二进制位相同为0,相异为1

注:他们的操作数必须是整数。

关于^操作符

0^a=a

a^a=0

^支持交换律:a^a^b=a^b^a=b

4.赋值操作符 =

赋值操作符是一个很棒的操作符,他可以让你得到一个你之前不满意的值。也就是你可以给自己重新赋值。

复合赋值符

+= 

-= 

*= 

/= 

%= 

>>= 

<<= 

&= 

|= 

^=

例如:

int x = 10; 
x = x+10; 
x += 10;//复合赋值 

其他运算符一样的道理。这样写更加简洁。

5.单目操作符

逻辑反操作 !

#include<stdio.h>

int main()
{
    int flag = 1;
    if (flag)
    {
        printf("hehe\n");
    }
    if (!flag)
    {
        printf("haha\n");
    }
    return 0;
}

取地址 & 和间接访问操作符 *

#include<stdio.h>

int main()
{
    int a = 10;
    int* pa = &a;
    *pa = 20;//解引用操作
    printf("%d\n", a);
    return 0;
}

操作数的类型长度 sizeof

int main()
{
    int a-=0;
    printf("%d\n",sizeof(a));//a的括号可以省略
    printf("%d\n",sizeofa);  //ok
    printf("%d\n",sizeof(int));//int的括号不能省略

    int arr[10]={0};
    printf("%d\n",sizeof(arr));
    printf("%d\n",sizeof arr); //ok
    printf("%d\n",sizeof(int[10]));//ok
    
    return 0;
}

函数调用的时候,要写(),但是sizeof后边的括号可以省略,说明sizeof不是函数,是操作符

按位取反 ~

#include<stdio.h>

int main()
{
    int a = 0;
    printf("%d\n", ~a);

    return 0;
}

(类型)强制类型转换

#include<stdio.h>

int main()
{
    int a = (int)3.14;
    printf("%d\n", a);
    return 0;
}

++ --

前置
#include<stdio.h>

int main()
{
    int a = 10;
    int b = ++a;

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

前置++:先++,再使用,相当于a=a+1;b=a

后置
#include<stdio.h>

int main()
{
    int a = 10;
    int b = a++;

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

后置++:先使用,再++,相当于int b=a;a=a+1

6.关系操作符

>= 

<= 

!=   用于测试“不相等” 

==      用于测试“相等”

这些关系运算符比较简单,但是我们要注意一些运算符使用时候的陷阱。 

警告: 在编程的过程中== 和=不小心写错,导致的错误。

7. 逻辑操作符

逻辑操作符有哪些:

&&     逻辑与 

||     逻辑或

区分逻辑与和按位与,区分逻辑或和按位或

按位与和按位或是通过二进制计算的,逻辑与和逻辑或只关注真和假

aba&&b
aba||b

8.条件操作符

也叫三目操作符

exp1 ? exp2 : exp3

如果表达式1为真,则计算表达式2的值,表达式2的结果就是整个表达式的结果

如果表达式2为假,则计算表达式3的值,表达式3的结果就是整个表达式的结果

9.逗号表达式

exp1, exp2, exp3, …expN

逗号表达式,就是用逗号隔开的多个表达式。 

逗号表达式,从左向右依次执行,整个表达式的结果是最后一个表达式的结果。

10. 下标引用、函数调用和结构成员

[ ] 下标引用操作符 

操作数:一个数组名 + 一个索引值

#include<stdio.h>

int main()
{
    int arr[10];
    arr[9] = 10;

    printf("%d\n", arr[9]);

    return 0;
}

( ) 函数调用操作符 

#include<stdio.h>
#include<string.h>
int main()
{
    int len = strlen("abcdef");
    
    printf("%d\n", len);

    return 0;
}

( )就是函数调用操作符,操作数:strlen,"abcdef"

访问一个结构的成员 

. 结构体.成员名 

#include<stdio.h>
struct Book
{
    char name[20];
    char author[30];
    int price;
};
int main()
{
    struct Book b1 = { "红楼梦","曹雪芹",128};
    struct Book b2 = { "西游记","吴承恩",168};
    printf("《%s》 %s %d\n", b1.name, b1.author,b1.price);
    printf("《%s》 %s %d\n", b2.name, b2.author,b2.price);
   
    return 0;
}

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

#include<stdio.h>
struct Book
{
    char name[20];
    char author[30];
    int price;
};
void print(struct Book* p)
{
    printf("《%s》 %s %d\n", p->name, p->author, p->price);
    //结构体指针->成员名
}
int main()
{
    struct Book b1 = { "红楼梦","曹雪芹",128};
    struct Book b2 = { "西游记","吴承恩",168};
  
    print(&b1);
    print(&b2);

    return 0;
}

也可以写成

#include<stdio.h>
struct Book
{
    char name[20];
    char author[30];
    int price;
};
void print(struct Book* p)
{
    printf("《%s》 %s %d\n", (*p).name, (*p).author, (*p).price);
}
int main()
{
    struct Book b1 = { "红楼梦","曹雪芹",128};
    struct Book b2 = { "西游记","吴承恩",168};
  
    print(&b1);
    print(&b2);

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值