1. 算数操作符
加 减 乘 除 模
%两个操作数必须为整数
/ 两个操作数均为整数整数除法 一个为小数就是小数操作符
2. 移位操作符 <<、 >>
<<左移
移位为二进制位
移位运算符,不要移动负数位(a>>-3 不可)
左边丢弃右边补0即可
#include<stdio.h>
int main()
{
int a = 13;
int b = a << 1;
printf("%d\n", a);
printf("%d\n", b);
return 0;
}
每一位均变为原来的二倍
a << 1 但a本身不会改变
如何让a 变呢
#include<stdio.h>
int main()
{
int a = 13;
a = a << 1;
printf("%d\n", a);
return 0;
}
此时a 就会改变
右移> >
- 算术右移
编译器使用的是算数右移
右边丢弃,左边补原符号位
//int a = -1;
//10000000000000000000000000000001原码
11111111111111111111111111111110反码
11111111111111111111111111111111补码=反码+1
#include<stdio.h>
int main()
{
int a = -1;
int b = a >> 1;
printf("%d\n", a);
printf("%d\n", b);
return 0;
}
- 逻辑右移
右边丢弃左边补0
一般不用
3.位操作符
& | ^
& 按位与 相同为本身不同为0注意负数用补码与
| 按位或 均为0才为0
^ 按位异或 相同为0 相异为1
4.赋值操作符:可以连续赋值
复合赋值符
+= -= 等等
5.单目操作符
! - + & sizeof ~ – ++ * (类型)
- size of
单位是字节
它不是函数(下面的例子说明)
1.sizeof //有的时候()可以去掉例如sizeof a) 但只有是符号的时候才行
不能写出sizeof int)
以下程序可以实现
#include<stdio.h>
int main()
{
int a = 3;
printf("%d\n", sizeof a);
printf("%d\n", sizeof(int));
2.一个表达式放在函数参数部分的时候会参与计算,而sizeof ()里面的表达式不会参与计算
#include<stdio.h>
int main()
{
short s = 3;
int a = 5;
printf("%d\n", sizeof(s = a + 5));//2
printf("%d\n", s);//3
return 0;
}
具体解释
test.c === === test.exe
转换之间
需要编译+链接
编译的时候2已经算出来了
但是s=a+5是在程序运行的时候才计算
//即为产生了exe之后运行才计算的15
但是编译的时候已经处理掉了
那个时候不放 sizeof(s = a + 5)
而只放了2
sizeof 处理时机远远早于计算时间
就是这个意思啦!
关于 ++ 、 - -
前置先操作后使用
后置先使用后操作
6.关系操作符
比较大小的
、>=、 <、 <= 、==、!=(不等于) ===《c陷阱和缺陷》
但注意字符串比较大小strcmp
7.逻辑操作符
&&(逻辑与)、||(逻辑或)
注意区分逻辑与和按位与
8.条件操作符
exp1?exp2:exp3
//1 也可以a>5? b=3:b=-3;
b=a>5?3:-3;
max=a>b?a:b;
逗号表达式,
会从左向右算,整个表达式的结果是最后一个表达式的结果
9.下标引用、函数调用和结构体成员
下标引用
arr[4]=5
//4[arr]=5
两个都可以说明[]是操作符 arr 和4是操作数 典型的数组的下标引用
结构体成员
结构体存放是相同或不同的数据的集合
结构体的本质是变量类型 ,因此也要定义变量
struct stedent
{
char name[20];
int age;
char sex[5];
}; //定义结构体类型,这个类型里面包含了很多的类型
struct student s 和int a
struct student 就相当于int
s 就是变量名 和a 一样
关于.和->
结构体变量访问它的成员用.
结构体指针用->
#include<stdio.h>
#include<string.h>
struct student
{
char name[20];
int age;
char sex[5];
}; //就像是int float 是一个类型
int main()
{
//结构体很重要
//结构体指针用->
struct student s = { "lisi","23","男" };//类似数组所以像数组的初始化方式
struct student* ps = &s;
//printf("%s\n",(*ps).name)与下面的语句是一个意思
printf("%s\n", ps->name);//->也是一个操作符
//char* p = "abcdef";//实际上是把a的地址给了指针
//错的
//结构体变量访问它的成员用.
//struct student s;
//s.name = "zhangsan"; 字符串
//s.age = "20";
//对的
struct student s;
strcpy(s.name, "zhangsan");
strcpy(s.sex, "男");
s.age = 20;
printf("%s %d %s\n", s.name, s.age, s.sex);
return 0;
}
一个关于strcpy
使用头文件#include<string.h>中的strcpy()和strcat()函数时出现了一个错误:error C4996: ‘strcpy’: This function or variable may be unsafe. Consider using strcpy_s instead.是因为strcpy()和strcat()函数不安全造成的溢出。
看别人的博客是说要按照以下操作才可以。
【项目属性】,点击【C++】里的【预处理器】,对【预处理器】进行编辑,在里面加入一段代码:_CRT_SECURE_NO_WARNINGS。
虽然我也不太懂为什么,但是确实是解决掉了
stycpy一般不用了,目前推荐的是memcpy