#define _CRT_SECURE_NO_WARNINGS 1
//#include<stdio.h>//std-标准-standard input output
//int main()//主函数-程序的入口-main函数有且仅有一个
//int是整型的意思
//main前面的int表示main函数调用返回一个整型值
//void main()已过时
//{
//short age = 20;//向内存申请2byte=16bit位,用来存放20
//float weight = 95.6f;//向内存申请4byte用来存放95.6
//printf("%d\n",sizeof(char));1//print-打印,printf-打印函数,
//printf("%d\n", sizeof(short));2 2^16
//printf("%d\n", sizeof(int));4
//printf("%d\n", sizeof(long));4/8
//printf("%d\n", sizeof(long long));8
//printf("%d\n", sizeof(float));4
//printf("%d\n", sizeof(double));8 数字代表字节 //计算机中单位
//C语言标准规定 // bit-比特位 1\0
// sizeof(long)>=sizeof(int) // byte-字节 1byte=8bit
// kb 1kb=1024byte
// mb 1mb=1024kb
// gb 1gb=1024mb
// tb 1tb=1024gb
// pb 1pb=1024tb
//return 0;//返回0
//在这里完成任务{}
//}
//数据类型
//char-字符数据类型-储存字符
//short-短整型
//int-整型
//long-长整型
//long long-更长的整型
//float-单精度浮点数,六位小数
//double-双精度浮点数
//%d-打印整型
//%c-打印字符
//%f-打印浮点数字-打印小数
//%p-以地址的形式打印
// %x-打印16进制
//C语言有没有字符串类型?答:没有
//为什么出现这
//变量,常量
//定义变量的方式 // int age = 150;
//float weight = 45.5f;
//char ch ="w";
//类型+变量名+赋值
//变量的分类 局部(定义在代码块之内的变量) + 全局(定义在代码块之外的变量) 二者名字建议不要相同-容易误会产生bug 同时存在时局部变量优先
//局部变量只能在局部使用
//变量的使用
//#include<stdio.h>
//int main()
//{
// int num1 = 0;
// int num2 = 0;
// int sum = 0;
// scanf("%d %d", &num1, &num2); scanf-输入函数 &-取地址符号
// sum = num1 + num2; C语言语法规定,变量要定义在当前代码块的最前面
// printf("sum = %d\n",sum);
// return 0;
//}
//变量的作用域和生命周期
//作用域-scope,程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用的
//而限定这个名字的可用性代码范围就是这个名字的作用域
//变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段
//局部变量的生命周期是-进入作用域生命周期开始,出作用域生命周期结束
//全局变量的生命周期是-整个程序的生命周期
//scanf是C语言提供的,scanf_s不是标准C语言提供的,而是VS编译器提供的,无法被其他编译器识别
//常量
//C语言中的常量分为以下几种:1.字面常量 直接的一个数字e.g.3,100,3.14
// 2.const修饰的常变量 const-常属性,不想让某一个值被改变时,再其前加const
// 3.#define定义的标识常量
//#define MAX 10
//
//{
// int arr[MAX] = { 0 };
// printf("%d\n", MAX);
//
// return 0;
//}
// 4.枚举常量(enum) 枚举-一一列举,e.g.三原色,星期
//enum Sex
//{
//MALE,
//FEMALE,
//SECRET
//};
//以上三值为枚举常量
//int main()
//enum Sex sex = FEMALE;
//printf("%d\n", MALE);//0
//printf("%d\n", FEMALE);//1
//printf("%d\n", SECRET);//2
//return 0;
//}
//字符串-由双引号引起来的一串字符称为字符串面值,或者字符串 e.g."abcdef"
// 注:字符串的结束标志是一个\0的转义字符。再计算字符串长度的时候\0是结束标志,不算做字符串内容
//{
// char arrl[]="abc";//数组
// char arr2[] = {'a','b','c',0};//0未字符串的结束标志
// printf("%s\n", arrl);
// printf("%s\n", arr2);
//
// return 0;
//}
//ASCLL表
//#include<stdio.h>
//int main()
//{
//char arr1[] = "abc";
//char arr2[] = { 'a','b','c' };
//printf("%d\n", strlen(arr1));//strlen-string length,用来计算字符串长度
//printf("%d\n", strlen(arr2));
//return 0;
//}//3,42(3,随机值)
//转义字符
//{
// printf("abc\n");//"n"和"\n"不同
// return 0;
//}
//{
// printf("c:\\test\\32\\test.c");//"\t"-水平制表符,即Tab(相当于四个空格)
// return 0;// \+1,即可解决问题,用\打败\.
//}
//{
// printf("(are you ok\?\?)\n");//"\?"-在书写连续多个问号时使用,防止它们被解析成三字母词
// return 0; //三字母词及其对应字符:
//} //??= 即 #
//??( 即 [
//??) 即 ]
//??< 即 {
//??> 即 }
//??/ 即 /
//??! 即 |
//??' 即 ^
//??- 即 ~
//{
// printf("%c\n", '\'');
// return 0;
//}//'
//#include<stdio.h>
//#include<string.h>
//int main()
//{
// //printf("%d\n", '\132');
// //printf("%d\n", strlen("c:\test\32\test.c"));//计算字符串长度
// //\32——32是2个8进制数字
// //32作为8进制代表的那个十进制数字,作为ASCII码值,对应的字符
// //32——>10进制为26——>作为ASCII码值代表的字符
// return 0;
//}
//#include<stdio.h>
//#include<string.h>
//int main()
//{
// printf("%c\n", '\x61');//\+数字=八进制,\x+数字=十六进制
// return 0;
//}
//C语言中的循环:1.while语句
// 2.for语句
// 3.do...while语句
//#include<stdio.h>
//int main()
//{
// int line = 0;
// printf("上大学\n");
//
// while (line < 20000)
//
// {
// printf("敲一行代码:%d\n",line);
// line++;
// }
// printf("好offer\n");
//
// return 0;
//}
//函数
//#include<stdio.h>
//int Add(int x, int y)//自定义函数-设计
//{
// int z=x + y;
// return z;
//}
//int main()
//{
// int num1 = 10;
// int num2 = 20;
// int sum = 0;
// int a = 100;
// int b = 200;
// //sum = num1 + num2;
// sum = Add(num1, num2);
// //sum = a + b;
// sum = Add(a, b);
// printf("sum = %d\n",sum);
// return 0;
//}
//数组:一组相同类型元素的集合
//int arr[10]={1,2,3,4,5,6,7,8,9,10};
//#include<stdio.h>
//int main()
//{
// int arr[10]={1,2,3,4,5,6,7,8,9,10};//定义一个存放10个整数数字的数组
// int i = 0;
// while (i < 10)
// {
// printf("%d ", arr[i]);
// i++;
// }
// //printf("%d\n", arr[4]);//下标形式访问元素
// //arr[下标]
// //char ch[20];
// return 0;
//}
//操作符:
//1.算数操作符:+ - * / %(取余数/取模mod)
//2.位移(二进制)操作符:<< >>
//3.位操作符:&(按位与) |(按位或)^(按位异或)
//{
// int a = 3;
// int b = 5;
// int c = a ^ b;//异或的计算规律:对应的二进制位相同,则为0,反之则为1
// //011
// //101
// printf("%d\n", c);
// return 0;
//}
//4.赋值操作符:= += -= /= &= ^= |= >>= <<=
//a = a+10 <=> a += 10
//5.单目操作符(有一个操作数):!-逻辑反操作 (0-假,非0-真)
//--负值
//+-正值
//&-取地址
//sizeof-操作数的类型长度(以字节为单位)
//~-对一个数的二进制按位取反
//---前置,后置--
//++-前置,后置++
//*-间接访问操作符(解引用操作符)和&是一对
//(类型)-强制类型转换
//#include<stdio.h>
//
//int Max(int x, int y)//函数后无“;”
//{
// if (x > y)
// return x;
// else
// return y;
//}
//int main()
//{
// int num1 = 10;
// int num2 = 20;
//
// int max = 0;
// max = Max(num1, num2);
// printf("max=%d\n", max);
//
// return 0;
//}
//#include<stdio.h>
//int main()
//{
// int a = 10;
// int arr[] = { 1,2,3,4,5,6 };//6*4=24
// printf("%zd\n",sizeof(a));//4
// printf("%zd\n", sizeof(int));//4
// printf("%zd\n", sizeof(arr));//24,计算数组大小,单位是字节
// printf("%zd\n", sizeof(arr) / sizeof(arr[0]));//6
// return 0;
//}
//{
// int a = 0;//一个字节,32比特位
// int b = ~a;//~-按(二进制)位取反
// //00000000000000000000000000000000
// //11111111111111111111111111111111,0变1,1变0
// //原码,反码,补码
// //负数在内存中存储的时候,存储的是二进制的补码
// //原码符号为不变,其它位按位取反得到反码,反码加一得到补码
// printf("%d\n", b);//使用的,打印的是这个数的原码
// return 0;
//
//}
//{
// int a = 10;
// //int b = a++;//后置++,a的值赋予b,給a+1
// int b = ++a;//a=11,b=11
// printf("a=%d,b=%d\n", a, b);
// return 0;
//}
//{
// int a = (int)3.14;
// return 0;
//}
//6.关系操作符
//> 大于
//>= 大于或等于
//< 小于
//<= 小于或等于
//!= 用于测试“不相等” 不等于
//== 用于测试“相等” 等于
//7.逻辑操作符(高中数学——或且非)
//&& 逻辑与
//|| 逻辑或
//{
// //真,非0:假,0
// int a = 0;
// int b = 5;
// int c=a || b;
// printf("c=%d\n", c);//c=1
// return 0;
//}
//8.条件操作符(三目操作符)
//exp1 ? exp2 : exp3(如果1可以执行,走2,如果1不执行,走3)
//{
// int a = 10;
// int b = 20;
// int max = 0;
// max = (a > b ? a : b);
// if (a > b)
// max = a;
// else
// max = b;
// printf("%d\n", max);
// return 0;
//
//}
//9.逗号表示符
//exp1, exp2, exp3, …expN
//10.下标引用,函数调用和结构成员
//[] () . ->
//int Add(int x, int y)
//{
// int z = 0;
// z = x + y;
// return z;
//
//}
//int main()
//{
// //int arr[10] = { 0 };
// //arr[4];//[]——下标引用操作符
// int a = 10;
// int b = 20;
// int sum=Add(a, b);//()——函数调用操作符
// return 0;
//}
//11111111111111111111111111111111,1*2^32-1
//100000000000000000000000000000000,1*2^32
// [1(-)][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]
// [0(+)][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]
// 只要是整数,内存中存储的都是二进制的补码
// 正数——>原码,反码,补码统一
// 负数——>
//原码 ——> 反码 ——> 补码
// 直接按正负写出的二进制序列 原码的符号位不变,其它位按位取反得到的 反码+1
// e.g.-2
// 10000000000000000000000000000010——原码
// 11111111111111111111111111111101——反码
// 11111111111111111111111111111110——补码
//有符号数
//常见关键字
//auto-自动 break-跳出当前循环 case-开关语句分支
// char-字符类型变量/函数返回值类型 const-只读变量
// continue-继续,结束当前循环,开始下一循环 default-其他
// do-循环语句的循环体 double else-条件语句
// enum-枚举类型 extern-引入外部符号,变量或函数是在其它文件或本文件其它位置定义
// float-浮点型变量或函数返回值类型 goto-无条件跳转语句
// if-条件语句 int-整型变量或函数 long register-寄存器变量
// return short signed-有符号类型变量或函数
// sizeof-计算数据类型或变量长度
// static-修饰局部变量,局部变量的生命周期变长;修饰全局变量,让静态变量只能在自己所在的源文件内部使用(不可以跨服聊天)
// struct-结构体类型 switch-用于开关语句 typedef-给数据类型取别名,类型重命名/重定义 union-共同体类型
//unsigned-无符号类型变量或函数 void-函数无返回值或无参数,无类型指针
//volatile-说明变量在程序执行中可被隐含地改变 while
//#include<stdio.h>
//int main()
//{
// auto int a = 10;//局部变量—自动变量,一般省略auto(自动)
//
// return 0;
//}
//{
// //register int a = 10;//建议把a定义成寄存器变量
// int a = 10;
// a = -2;
// //int定义的变量是有符号的
// //signed int;
// unsigned int num = 1;//u_int=unsigned int
// return 0;
//}
//自定义符号名不能冲突
//void test()
//{
// static int a = 1;//有static-2 3 4 5 6,无static-2 2 2 2 2
// a++;
// printf("a=%d\n",a);
//}
//int main()
//{
// int i = 0;
// while (i < 5)
// {
// test();
// i++;
// }
// return 0;
//}
//#define定义常量和宏
//define定义标识符常量——
//#define MAX 100
//Max(int x, int y)
//{
// if (x > y)
// return x;
// else
// return y;
//}
//define定义宏——#define ADD(x,y) ((x)+(y))
#define MAX(X,Y) (X>Y?X:Y)
int main()
{
//int a = max;
int a = 10;
int b = 20;
//函数
int max = Max(a, b);
printf("max=%d\n",max);
//宏的方式
max = MAX(a, b);
//max=(a>b?a:b);
printf("max=%d",max);
return 0;
}
//指针
//内存
//内存是电脑上特别主要的存储器,计算机中所有程序的运行都是在内存中进行的。
//所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。
//为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。