#define _CRT_SECURE_NO_WARNINGS 1
//操作符
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
// 算术操作符
// + - * % / %操作符的两边必须为整数,输出的是除法之后的余数
//int main()
//{
// //int a = 3 / 5; //两边都是整数,商0余3 因此他的结果是0
// //printf("%d", a);
// //如果想得到小数,就可以如下操作
// /*float a = 3.0 / 5;
// printf("%f", a);*/
// return 0;
//}
// 移位操作符
//int main()
//{
// int a = 2; //2在二进制里是00000000000000000000000000000010
// //向左移动一位是00000000000000000000000000000100 数字变成了4
// int b = a << 1;
// printf("b=%d", b);
// return 0;
//}
//int main()
//{
// int a = 10; //2在二进制里是0000000000000000000000000001010
// //向右移动一位是00000000000000000000000000000101 数字变成了5
// int b = a >> 1;
// printf("b=%d", b);
// return 0;
//}
// 算数右移:右边丢弃,左边补原来的符号位 通常都是算数右移
// 逻辑右移:右边丢弃,左边补0
// 算数右移和逻辑右移
//
//
// 位操作符
// &与 |或 ^异或 必须都是整数
//对于正整数来说,原码,反码和补码相同
//int main()
//{
// //int a = 3;
// //int b = 5;
// //int c = a & b; //按二进制位进行与
// //00000000000000000000000000000011
// //00000000000000000000000000000101
// //00000000000000000000000000000001 因此 c就等于1
//
// /*int a = 3;
// int b = 5;
// int c = a | b;
// printf("c=%d", c);*/ //按二进制位进行或
// //00000000000000000000000000000011
// //00000000000000000000000000000101
// //00000000000000000000000000000111 因此c就等于7
//
// //int a = 3;
// //int b = 5;
// //int c = a ^ b;
// //printf("c=%d", c); //按二进制位进行异或 异或的计算规则是,相同为0,相异为1
// //00000000000000000000000000000011
// //00000000000000000000000000000101
// //00000000000000000000000000000110 因此c就等于6
// return 0;
// }
//整型有最大值,如果数值太大会溢出
//交换a和b,但不允许采用第三个变量
//int main()
//{
// int a = 3;
// int b = 5;
// //第一种方法:如果a和b很大就会溢出
// /*a = a + b;
// b = a - b;
// a = a - b;*/
//
// //第二种方法 a=011 b=101
// a = a ^ b; //a=110 b=101
// b = a ^ b; //a=110 b=011
// a = a ^ b; //a=101 b=011
//
// return 0;
//}
//编码实现:寻找一个整数在内存中的二进制位代码中有几个1 内存中以补码形式存放
//赋值操作符 = += -= *= /= >>= <<= %= |= &= ^= ~
//连续赋值 (不建议连续赋值) a=x=y-1 y-1的值赋给x,然后把x赋给a
//单目操作符
/// ! + - & sizeof() ++ -- *
//int [10] 是数组类型
//int main()
//{
// short s = 5;
// int a = 10;
// printf("%d", sizeof(s = a + 2)); //sizeof中的表达式不参与运算
// printf("%d", s);
// return 0;
//}
//~对一个数的二进制位进行取反
//int main()
//{
// int a = -1;
// //1000000000000000000000000000000001原码
// //1111111111111111111111111111111110 反码
// //1111111111111111111111111111111111 补码
// //~按位取反
// //1111111111111111111111111111111111
// //0000000000000000000000000000000000
// int b = ~- 1;
// printf("%d\n", a);
//
// printf("%d", b);
// return 0;
//}
//++ --这两个操作符都有前置或者后置操作
//int main()
//{
// //int a = 10;
// //int b = a++; //使用这个后置++ ,如果这个时候输出a和b,,,那么b等于10 a等于11 先使用后++
// //int c = ++a; //如果这个时候输出a和b,,,,先++ 后使用
//
// int a = 10;
// printf("%d", a--); //10
// printf("%d", a); //9 因为a自减了,所以这个就是9
//
//
// return 0;
//}
//int main() ///地址的大小就是4或者8,看看是三十二位还是六十四位
//{
// int a = 0;
// printf("%p\n", & a); //取地址,地址是一个十六进制的内存编号
// int*pa = &a; //用来存放地址,pa就是一个指针变量 他的类型是int*
// *pa=20; //*这个*叫做解引用操作符,--间接引用操作符
// printf("%d", a);
//
// return 0;
//}
//关系操作符--------用来比较大小,,,需要注意,一个等号叫赋值,两个等号来判断想不想等,,,,比较两个字符串相等不能使用等号
// > >= < <= != ==
//逻辑操作符
//int main()
//{
// int i = 0, a = 0, b = 2, c = 3, d = 4;
// // i = a++ && ++b && d++; //在这个&&操作符上面来说,第一个都已经为假了,其他的就已经不用算了
// // printf("a=%d\nb=%d\nc=%d\d=%d", a, b, c, d); // 1,2,3,4
//
// i=a++||++b||d++; //a为真后面都不用算了
// printf("a=%d\nb=%d\nc=%d\d=%d", a, b, c, d);
// return 0;
//}
//条件操作符
//三目操作符 exp1?exp2:exp3 //如果表达式1成立,则结果为表达式2,否则是表达式3
//int main()
//{
// int a = 3;
// int b = 0;
// if (a > 5)
// b = 1;
// else
// b = -1;
// //三目操作符 b = a > 5 ? 1 : -1
// return 0;
//}
//逗号表达式
// exp1,exp2,exp3,。。。。expN;
//int main()
//{
// int a = 3;
// int b = 5;
// int c = 0;
// int d = (c = 5, a = c + 3, b = a - 4, c += 5); //结果是最后一个表达式,但是前面的表达式也要依次计算
// //逗号表达式:要从左向右依次计算,但整个表达式的结果是最后一个表达式的结果
//
// return 0;
//}
//下标引用操作符
//[]这个方括号就是下标引用操作符
//函数调用操作符
//()---函数调用操作符,,他的操作数分别是函数名,和参数
//结构成员访问操作符
// .
// ->
//结构体
//struct Book
//{
// //结构体成员变量
// char name[20];
// int price;
// char number;
//};
//int main()
//{
// int num = 10;//普通类型的使用方式
// struct Book b = {"cyuyan",123654,"c2001220"};
// //printf("数名:%s\n", b.name);
// //printf("数hao:%d\n", b.price);
//
// struct Book* pb = &b; //结构体的地址访问
// printf("数名:%s\n", (*pb).name); //解引用找到了b
//
// printf("数hao:%d\n", pb->price); //结构成员操作符的另一个应用 :结构体的指针->结构体成员名
//
// return 0;
//}