"+" 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表示实数)
">>" 向右移位 将数的二进制形式向右移一位,
"<<" 向左移位 将数的二进制形式向左移一位,
(例题)
(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)
操作数:一个数组名+一个索引值
int arr [10] // 创建数组
arr [9] = 10 // 实用下标引用操作符,数组中下标为9的数字,表示第10个数,他的值为10。
(数组中的下标第一位是 0,第二位是1,以此类推)
[ ] 的两个操作数是 arr 和 9。
#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.
"." 结构体。成员名 (变量用点号)
"->" 结构体指针->成员名 (指针用指向符)(前边是指针才用指向符)
#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; }