1:‘/’ 运算符两侧至少有一个浮点数时候结果才产生的是浮点数,与值存入的类型无关;
2:‘%’取模操作符(求余)两端必须是整数;
3:‘<<’左移操作符,移动的是数值二进制位;“左边丢弃、右边补零”
#include <stdio.h>
int main()
{
int a = 2;
int b = a << 1;
printf("b=%d", b);
return 0;
}
4:‘>>’右移操作符分为算术右移(右边丢弃、左边补原符号位)与逻辑右移(右边丢弃、左边补补零);
#include <stdio.h>
int main()
{
int a = -10;
int b = a >> 1;
printf("b=%d", b);
return 0;
}
注意:左移或者右移时本身数的值不会改变;
5:负数二进制的存储:
原码:按照数值写出的二进制形式即为原码;
反码:符号位不变、剩余位按位取反;
补码:符号位改变,剩余位不变;(负数是以补码形式存放的)
6:&按位与,|按位或、^按位异或
(1):按位与
#include <stdio.h>
int main()
{
int a = 3;
int b = 5;
int c = a & b;
printf("c=%d", c);
return 0;
}
(2):按位或
#include <stdio.h>
int main()
{
int a = 3;
int b = 5;
int c = a | b;
printf("c=%d", c);
return 0;
}
(3):按位异或 异或(相同为零、相异为1)
#include <stdio.h>
int main()
{
int a = 3;
int b = 5;
int c = a ^ b;
printf("c=%d", c);
return 0;
}
注意:按位与 按位或 按位异或 的操作对象必须为整数;
eg:合理使用逻辑运算符可以在不创建第三个变量的情况下完成两个变量值的交换;
#include <stdio.h>
int main()
{
int a = 3;
int b = 5;
printf("a=%d b=%d\n", a, b);
a = a ^ b;
b= a >> 1;
a = a ^ b;
printf("a=%d ", a);
printf("b=%d ", b);
return 0;
}
7:赋值操作符:
(1):直接赋值:'='
(2):复合赋值法:+=、-=、*=、&=、|=、^=等操作符称为复合操作符;
eg:a=a+10;等价于 a+=10;
8:单目操作符:只有一个操作数;
!、-、+、&、sizeof(操作数类型长度)、~(二进制按位取反)、--、++分为前置和后置;、*、(强制类型转换)
注意sizeof是当作操作符来使用的
#include <stdio.h>
int main()
{
char arr[10] = {};//char 每个占一个字节;int 每个占四个字节;
printf("%d", sizeof(arr));
printf("%d", sizeof(int [10])); int [10]表示的是数组类型;
return 0;
}
sizeof()括号内的表达式不参与运算;
#include <stdio.h>
int main()
{
short s = 5;
int a = 10;
printf("%d\n", sizeof(s = a + 10));
printf("%d", s);
}
该代码打印结果是2;5;第一个printf打印的是short s 的所占字节数,即时将int类型的放入short类型之中,但是会产生截断,因此short s 的字节数仍然为2;
第二个printf打印的是s的值;打印的值仍然为s的最初赋值;因为sizeof()括号内的表达式不参与程序运算;
‘~’按位取反操作符
#include <stdio.h>
int main()
{
int a = -1;
int b = ~a;
printf("%d", b);
return 0;
}
该代码输出结果为零;因为负数在存储时候存储的是它的补码,-1的补码全为1按位取反后为0;
9:取地址操作符 &:
#include <stdio.h>
int main()
{
int a = 5;
printf("%p\n", &a);
int * ad = &a;
*ad = 6;
printf("%d", a);
return 0;
}
*ad:“解引用操作符”直接通过地址改变a的值;
int *ad =&a 中的*ad表示的是ad是一个指针变量;
10:(强制类型转换操作符)
#include <stdio.h>
int main()
{
int a = (int)6.66;
printf("%d", a);
return 0;
}
11:关系运算符
!=,>=,<=,==,<,>;
注意判断是否相等的“==” 操作符不能在比较两个字符串的时候使用;
12:逻辑操作符
逻辑与:&&、逻辑或:||
#include <stdio.h>
int main()
{
int a = 5;
int b = 6;
if (a && b)//逻辑与与逻辑或只用来判断真假;
{
printf("hehe\n");
}
return 0;
}
使用时候需要注意区分按位与和按位或的区别;逻辑与和逻辑或判断的是真假;按位与和按位或是针对的二进制来说;
eg:
#include <stdio.h>
int main()
{
int i = 0,a = 0,b = 2,c = 3 ,d = 4;
i = a++ && ++b && d++;
printf("a=%d\n b=%d\n c=%d\n d=%d\n",a,b,c,d);
return 0;
}
注意:本代码输出结果为1,2,3,4
因为表达式i=a++&&++b&&d++;执行的时按位与符号当第一位操作数为0时候;表达式就不往后执行了,因此代码输出结果为a=1,b=2,c=3,d=4;
同理当遇到逻辑或的时候:比如“a||b||c”当a为真的时候后面针对b和c的操作就不再执行了;
13:条件操作符:三目操作符;
表达式1 ? 表达式2 :表达式3
当表达式1为真的时候,整个表达式的值为表达式 2的值;当表达式1为假的时候整个表达式的值为表达式3的值;
14:逗号表达式:
#include <stdio.h>
int main()
{
int a = 5;
int b = 3;
int c = 0;
int d = (c = 5, a = b + c, b = a - 2, c = a + b);
printf("%d", c);
return 0;
}
逗号表达式int d = (c = 5, a = b + c, b = a - 2, c = a + b);括号中从左到右依次计算,但整个表达式的值为最后一个表达式的值;因此本代码输出的结果为:d=14;
15:下标引用操作符:数组名+索引值eg:arr[1]
16:结构成员访问和点操作符(结构体.成员名):
定义或者创建自定义类型:
#include <stdio.h>
struct Book//创建了一个自定义类型
{
char name [10];
char id [10];
int price;
};
int main()
{
int num = 10;
struct Book b = { "cyuyan","AbCd",50 };
printf("书名:%s ID:%s 价格:%d",b.name,b.id,b.price);
return 0;
}
首先使用struct 创建一个自定义类型,然后分别给其增加内容,如:书名、书号、价格等、然后在主函数中对书名、书号、价格进行内容的填充、再使用点操作符b.name、b.id、b.price对其中的内容进行打印;
同样也可以使用指针来打印结构体中的内容;具体代码如下:
#include <stdio.h>
struct Book//创建了一个自定义类型
{
char name [10];
char id [10];
int price;
};
int main()
{
int num = 10;
struct Book b = { "cyuyan","AbCd",50 };
struct Book*pb=&b;
printf("书名:%s ID:%s 价格:%d",pb->name,pb->id,pb->price);
return 0;
}
17:整型提升的意义:
表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度。因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。通用CPU 是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行运算。
#include <stdio.h>
int main()
{
char a = 3;
char b = 127;
char c = a + b;
printf("%d", c);
return 0;
}
该段代码输出的结果为-126;因为发生了整型提升;char占一个字节,表示的二进制位几位8位;a=00000011;b=011111111;c=10000010;此时打印的时候使用的是%d,因为char没有达到int类型的大小,因此发生整型提升;最终计算结果为:10000000 00000000 00000000 11111110;即为-126;