学习笔记
2021.8.2
1.枚举
可以用枚举代替const int 定义名字,
2021.8.3
1.结构
结构和数组有点像,但结构里不同的单元可以是不同的类型,数组必须是一样的类型
数组用[]运算符访问 a[0]=10;
结构用.访问 today.month、pl.x、pl.y
2.结构运算【数组都不可以】
对整体做赋值、取地址;
p1=(struct point){5,10}; //赋值
p1=p2; //值的传递
int main(int argc,char const *argv[]){
//在main函数里声明结构类型
//如果在main函数外面,一般是在外面做声明
struct date{
int month;
int day;
int year;
}; //声明结构类型
int main(int argc,char const *argv[]){
struct date today; //定义变量
struct date today{07,31,2014}; //大括号给初始值
struct date thismonth={.month=7,.year=2014}; //依次给值,没有给的会给成0
printf("today is %i=%i=%i",today.year,today.month,today.day};
1.
struct date{
int month;
int day;
};
struct point p1,p2; //p1,p2都是point,定义的变量名字是p1,p2,类型是struct point;
2.
struct{
int x;
int y;
}p1,p2; //p1,p2都是一种无名结构,里面有x和y;
3.
struct point{
int x;
int y;
}p1,p2; //同时声明了结构类型和变量;
3.输出问题
%.2i输出的小数位为2位小数
4.c语言中“.”与“->”的区别
struct point{
int x;
int y;
}; //每个点的横坐标x和纵坐标y
struct rectangle{
struct point pt1;
struct point pt2;
}; //矩形有两个对角点
struct rectangle r; //可以有 r.pt1.x r.pt1.y r.pt2.x r.pt2.y
//定义变量
struct rectangle r,*rp;
rp=&r;
// r.pt1.x
// rp->pt1.x
// *rp.pt1.x
//三者等价
2021.8.4
1.__func__ 字符串 所在函数的名称;(2021.8.5 2.预定义的宏)
#include<stdio.h>
int gALL=12;
int main(int argc,char const *argv[]){
printf("in %s gALL is %d",__func__,gALL);
return 0;
}
//结果
in main is 12
2.全局变量;
上面的函数 gALL 就是全局变量,和任何函数都没有关系,无论函数在不在;
初始值 0值或者NULL(指针);
3.静态本地变量
在本地变量前加 static 修饰,加上之后离开函数静态本地变量仍然存在,原始的值还存在;
static int all ...
静态本地变量实际上就是全局变量;
warning:不要用全局变量来传递值和参数;
尽量避免用全局变量;
丰田汽车的案子
2021.8.5
1.编译预处理 #号开头的语句并不是c语言,也可以用于其他语言,因此不需要加分号;
#include
#define PI 3.14159 定义符号define PI是宏的名字 3.14159是这个宏的名字
在编译之前会做一次预处理,将所有c语言程序里出现的PI都换成3、14159
2.预定义的宏
__LINE__ 行号
__FINE__所在文件名的全路径
__DATE__日期
__TIME__时间
int main(int argc, char const* argv[]) {
printf("%s:%d\n", __FILE__, __LINE__);
printf("现在的日期是:%s,现在的时间是%s\n",__DATE__,__TIME__);
return 0;
}
3.像函数的宏 带参数的宏
#define cube(x) ((x)*(x)*(x))宏可以带参数
【一切都要有括号 整个值要有括号 参数出现的地方要有括号!!!!!】
#define cube(x)(x*57)
#define cube2(x)(x)*5 //是错的!
可以带多个参数: #define MIN(a,b)((a)>(b)?(b):(a))
宏定义千万不要加分号!
【带参数的宏
在大型程序的代码中使用的非常普遍
可以非常复杂,甚至可以产生函数,
在#和##这两个运算符
缺点:定义宏是没有任何类型检查的】
有个新的inline函数代替,可以取代带参数的宏。
4.其他编译预处理指令
① 条件编译
② error
5.源文件和头文件
首先,源文件就是.c结尾的文件,每个小的源文件需要在同一个项目下,才能互相“识别”
为了今后比较长的代码不至于往下翻找每个函数,可以把函数单独列在一个源文件里,放在同一个项目即可。
头文件:.h结尾的文件,用#include 来调用 【 #include "max.h"】
把函数原型放在一个头文件中,用#include调用后编译器就知道了函数原型是什么 头文件是个桥梁
6.#include
把文件全部原封不动的插入
因此,#include不一定出现在 .c源文件之前
#include有两种形式 ① <>【系统给的】
② “” 【自己定义的】
误区:#include不是用来引入库的
stdio.h里只有printf的原型,编译产生的目标代码文件都不在stdio.h,在某个.lib中。
只是让编译器知道函数原型、
累计问题
1.【scanf出错的问题】
项目 —> 属性 —> 所有选项中的SDL检查变为否 就可以;
2.【"const char *" 类型的实参与 "char *" 类型的形参不兼容】
项目 —> 属性 —> 将语言中的“符合模式”变为否 就可以;
3. (a)>(b)?(b):(a)
a大于b吗?大于的话值就是b,否则就是a