C语言笔记(操作符)

it2022-06-25  91

一、操作符

1、算数操作符

"+"    a+b表示a+b

"-"     a-b表示a-b

"*"     a*b表示axb

"/"      a/b表示a除以b

"%"    计算余数    eg:10%3表示计算10/3的余数     10%3=1      

%u 十进制无符号整数 %f 浮点数 %s 字符串 %c 单个字符 %p 指针的值 %e 指数形式的浮点数 %x, %X 无符号以十六进制表示的整数 %0 无符号以八进制表示的整数 %g 自动选择合适的表示法

另外(%d表示整数,%f表示实数)

2、移位操作符

">>"   向右移位     将数的二进制形式向右移一位,

"<<"   向左移位     将数的二进制形式向左移一位,

(例题)

(1)unsigned char x=3;

x<<1是多少?x>>1是多少?

 

对于无符号数值3来说,3的二进制编码为:00000011,向左移位的方式为最左边一位0舍去,最右边移进来的一位补0,则结果的二进制编码为 : 00000110,转换为十进制数为6,所以x<<1(向右移一位)的值为6,。

向右移位的方式是最右边一位舍去,最左边补进来的一位为0,则 00000011 转化为00000001,其十进制的结果为1,所以x>>1(向左移一位)的值为1。

 (2)char x=3;  x<<1是多少?x>>1是多少? 

对于有符号的数值3来讲,移位之后就要考虑它的正负性,因为二进制编码的第一位(0表示+,1表示-)

3的二进制编码为:00000011,向左移位的方式为最左边一位0舍去,最右边移进来的一位补0,则结果的二进制编码为 : 00000110,转换为十进制数为6,所以x=3;x<<1(向右移一位)的值为6,。

由于3是有符号数值,在移位过程中有逻辑右移和算数右移两种方式,大多数计算机采用算数右移的方式。

向右移位的方式是最右边一位舍去,最左边补进来的一位为0,则 00000011 转化为00000001,其十进制的结果为1,所以x>>1(向左移一位)的值为1。

(3)char x=-3;  x<<1是多少?x>>1是多少? 

因为负数是以补码的方式进行存储的,所以计算机计算时采用补码的方式进行计算。

-3的原码为:1000 0011

第一位是符号位,不变,然后其他各位取反,变成1111 1100,然后给最后一位加1,变成1111 1101,

1111 1101就是-3的补码。

用1111 1101来计算,最左边一位向左移一位舍去,最右边空下来的一位补上0,变成1111 1010,把这个反码-1,变为

1111 1001,然后让符号位不变,按位取反,获得的原码为1000 0110,则这个二进制数表示的值为-6.所以charx=-3,x<<1,得出的结果为-6.

同样计算x>>1,使用-3的补码计算,1111 1101。最右边一位舍去,最左边一位补上符号位,(注意,负数的右移补得不是0,要补符号位1)变成1111 1110,把这个反码-1,变成11111101,然后符号位不变,按位取反,1000 0010,其值为-2。

所以char x=3,x>>1,得出的结果为-2。

三、位操作符(双目操作符)

"&"    表示按位与

按位与运算,功能是参与运算的两个数对应的二进制编码,这两个二进制编码每一位上的数按位与操作,只有当两个位置上的数值都为1时,结果才为1。

规则(在二进制编码中,不是具体的0 1数值):

1&1=1

1&0=0

0&1=0

0&0=0

例如:4&5=x

4的二进制编码:0000 0100

5的二进制编码:0000 0101

按位与操作:0000 0100

x的原码为: 0000 0100   转换为十进制整数为:4

则4&5=14

"|"    表示按位或

按位或运算,参与运算的两个整数的二进制编码,每一位上的数值参与按位或运算规则如下,只要两个数中有一个为1,那么其结果为1。

规则:

1|1=1

1|0=1

0|1=1

0|0=0

例如: 7|9=x

7的二进制编码:0000 0111

9的二进制编码:0000 1001

按位或操作:0000 1111    十进制数值为15

"^"    表示按位异或

按位异或运算,参与运算的两个数值的二进制编码,每一位上的数值参与按位异或的算法,简单来讲就是 不同为1,相同为0。

例如:5^6=x

5的二进制编码:0000 0101

6的二进制编码:0000 0110

按位异或操作:  0000 0011   转换为十进制的数值为3。

四、赋值操作符

"="    基本的赋值运算符是“=”。一开始可能会以为它是“等于”,其实不是的。它实际上意味着把右边表达式的值赋给左边的运算数。

"+="   加赋值                          例如 x+=6  ,等价于x=x+6。       

"-="    减赋值                          例如 x-=6  ,等价于x=x-6。

"*="   乘赋值                           例如 x*=6  ,等价于x=x*6。

"/="    除赋值                           例如 x/=6  ,等价于x=x/6。

"&="  按位与赋值                   例如 x&=6  ,等价于x=x&6。

"|="   按位或赋值                    例如 x|=6  ,等价于x=x|6。

"^="  按位异或赋值                例如 x^=6  ,等价于x=x^6。

">>="  右移赋值                     例如 x>>=6  ,等价于x=x<<6。

"<<="左移赋值                       例如 x<<6  ,等价于x=x>>6。

五、单目操作符

"!"    逻辑反操作   表示逻辑非         例如:

"-"    负值    表示负值 

"+"  正值    表示正值

"&"  取地址     例如  &a,表示取地址a内的数值

"sizeof"  操作数的类型长度(以字节为单位)      计算字节数

"~"    对一个数的二进制按位取反   

(正数的原码,补码,反码都相同,都等于它本身 负数的补码是:符号位为1,其余各位求反,末位加1 反码是:符号位为1,其余各位求反,但末位不加1 也就是说,反码末位加上1就是补码 )

"--"   前置、后置    "++" 前置、后置++

后置表示先执行,后加减,前置表示先加减后执行。

"*"  间接访问操作符(解引用操作符)   用于指针

"type"  强制类型转换  改变数据的类型,int a =(Int)18.9(将18.9福鼎型数据强制转换为整型数据。

六、关系操作符

">"      比较大小 ">="   比较小于或者等于

"<"     比较大小

"<="    比较小于或者等于

"!="     用于测试“不相等”

"=="     用于测试“相等”

七、逻辑操作符

"&&"   表示逻辑与

表达式1 &&  表达式2    (短路与)如果表达式1为真,执行后面的表达式2,如果表达式1为假,不执行表达式2

"||"      表示逻辑或

表达式1 ||  表达式2   如果表达式1为真,不执行表达式2,如果表达式1为假,执行表达式2。

八、条件操作符

exp1 ? exp2 : exp3      (书写时注意问号和冒号)

执行方式:如果exp1为真,执行exp2,如果exp1为假,执行exp3。

九、逗号表达式

exp1,exp2,exp3,exp4...........expn

逗号表达式,就是用逗号隔开的多个表达式,逗号表达式,从左向右依次执行,整个表达式的结果是最后一个表达式执行的结果。(无论条件真假都会执行)

例如:

int a =1;

int b=2;

int  c =( a > b, a = b + 10, a , b =  a + 1);

c的值为多少?13  (b=a+1=b+10+1=2+10+1=13)

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

1、[ ]下标引用操作符

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

int  arr  [10]    // 创建数组

arr [9]  = 10 //   实用下标引用操作符,数组中下标为9的数字,表示第10个数,他的值为10。

(数组中的下标第一位是 0,第二位是1,以此类推)

[ ]  的两个操作数是 arr 和 9。

2、() 函数调用操作符,接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给和函数的参数。

#include<stdio.h> void test1() {     printf("hehe\n");     } void test2(const char *str)

{     printf("%s\n", str); } int main() {     test1();                  //实用()作为函数调用操作符。     test2("hello bit.");//实用()作为函数调用操作符。     system("pause");     return 0; }

代码输出结果为

 hehe

hello bit.

3、访问一个结构体成员

"."     结构体。成员名    (变量用点号)

"->"  结构体指针->成员名  (指针用指向符)(前边是指针才用指向符)

#include<stdio.h> struct stu {     char name[10];     int age;     char sex[5];     double score; }; void set_age1(struct stu stu) {     stu.age = 18; } void set_age2(struct stu* pstu) {     pstu-> age = 18;//结构成员访问 } int main() {     struct stu stu;     struct stu* pstu = &stu;//结构成员访问

    stu.age = 20;//结构成员访问     set_age1(stu);

    pstu->age = 20;//结构成员访问     set_age2(pstu);

    system("pause");     return 0; }

 

 

 

 

 

 

 

 

 

 

 

 

 

 


最新回复(0)