声明放.h文件里
定义放在cpp文件里
#include "1.funcA.h" 这是函数声明
声明放.h文件里
定义放在cpp文件里
#include "1.funcA.h" 这是函数声明
ax+by
mid 项数 x是三角数中的值
递归:函数定义里调用了自身于是从头运行函数 直至函数不再调用自身 到出口结束
int main()
{
int a = 10;
int c = 11;
int &b = a; // 必须进行初始化;
b = c; // b 并没有指向c, 它还是a的别名,但a的值变成了与c一样;
cout << "a : " << a << endl;
cout << "b : " << b << endl;
cout << "c : " << c << endl;
}
printf("%g")以什么样的方式输入以什么样的方式输出
#108求面积 字符swtich
if(xxx) 当xxx为0时if 假
xxx不为0if为真
if (a++&&b++)
计算机先看a值 a为0 与运算直接为假 因此a++后b++不会运行 短路
1-(1/a+1/b)*t-(1/a+1/b-1/c)*h=0
1=(1/a+1/b)*t+(1/a+1/b-1/c)*h
<inttypes.h>
int8_t 八位一字节 最大值127最小值-128 最小值比最大值大一
格式占位符写法
printf("%"PRId"\n",a)
int8_MIN最小值 MAX最大值
#include <math.h>
int n;
int x=0;
const double pi=acos(-1)--反三角函数 得出pi是Π
scanf("%lf",&n);
x=n*pi/180;
printf("%lf\n",x);
①a=b 把b的值赋给a
② a=4/3 a=1 因为a是整型时只取整数部分
即便double a 计算机看到4/3 两个整型会自动把答案变成整型
处理方法:a=4.0/3
③& 与运算 都为1 为1 其余为0
举例:2&3
10 &11 → 10
④| 或运算 都为0 为0 其余为1
举例:2|3
10 | 11 → 11
⑤^ 异或运算 相同为0 其余为1
举例:2^3
10^11 → 01
⑥ ~取反运算
举例:~2
10→01
⑦<<左移 向左移位 值乘2 低位补0 符号位不变
⑧>>右移 向右移位 值除2 向下取整 符号位不变 其中带负号时 -3>>1 值为-2
00000011(3)--11111101--(-3) 11111110(-3>1)--00000010(-3右移取反以后的值)就是2 所以-3>1 就是负2
①scanf("%[^\n]s") 输入的内容除了^(非号)后面的东西以外的全部读入 本条是指除了回车以外的全部读入
②getchar()强行取出最后一个字符 ①中由于最后有回车 用getchar取掉回车
③sprintf(str2,"%d",str) 读入str的值将其写入str2
④sprintf(str2,"(%d)",str)输出后为 (str)
sprintf(str2,"%d.%d.%d",&a,&b,&c)输出后为a.b.c
所以说sprintf可以在%d处改变输出的格式 加括号加.
sprintf 可以用于字符串的输出
⑤fprintf 可以用于字符串的输出
fprintf(abc,"%d",str)将str字符串输出到abc文件中
⑥stdin标准输入 stdout标准输出 stderr标准错误输出 可以输出bug结果
printf 函数
头文件: stadio.h
原型: int printf(const char *format, ...);
format: 格式控制字符
...:可变参数列表
返回值:输出字符的数量
# 结构体
struct person {
}
为什么format要用指针?
因为可能有很多格式
有个疑问,怎么保障va_list的安全性。比如3.func.cpp题目中main中的n的值如果大于后面的实际入参列表长度,那么就会越界访问堆栈空间。
简单上网查了下,没找到特别的线索?
总结:
1、
【头文件和源文件之间,来回编写】
测试框架的整体编写过程,根据“声明放头文件,定义放源文件”的原则,在头文件和源文件之间,来回编写;特别地,例如创建数据结构(链表),需要创建新的头文件;
2、
【在测试框架中,数组和链表的作用差距体现在哪呢?】
数组的大小,在程序运行之前,就已经提前被确定下来了,例如大小为100的整型数组,大小为400的字符串,大小为800的浮点型数组等等;
而链表的节点数目是随着程序的运行而逐个逐个确定的。
链表,如果新增一个元素,新增一个节点;新增100个元素,新增100个节点。
因此,可以让测试用例的数目,不受到数组大小的限制。
3、
【让任意一个结构,附带链表性质】
我们可以让任意类型,拥有链表这个特性;也可以把不同类型的节点,穿成一串;
任何一个结构,不是链表形态,没关系;在最后一个字段放一个LinkNode即可。
马上可以支持链表操作,就像一个外骨骼一样。这是一个十分优美的设计!
4、
【计算偏移量和首地址】
在T类型中的int偏移量是多少?
首先将0(零)地址,转成T*地址
再引用T*地址的Name字段
再去取这个字段的地址
再把地址强转long long————就是当前这个地址的偏移量。//64位操作系统的地址,就是long long类型,8字节;
代码如下:
#define offset(T, name) ((long long)(&(((T *)(0))->name)))
如何通过下一个节点的地址,去确定下一个结点的头地址?
先把p转成char *类型地址
减去相关偏移量offset(T, name)
再强转成T *类型————这就是下一个节点的首地址
#define Next(p, T, name) ((T *)(((char *)p) - offset(T, name)));
总结:
一、【泛型编程】:一般而言函数没有办法进行泛型编程,不能一会输出浮点型,一会输出整型。但是,一些情况下,可以用泛型宏把变量转换成字符串型,打印字符串就行了。
二、【宏替换变量的时候,有两点值得注意】
1、防止宏替换的变量中有a++,造成多次++,因此用新的变量_a和_b来存储 a和b的值,就会避免重复替换导致多次++。(此前,讲宏的时候提到过)
2、因为,a和b类型有可能不一样,因此要分开写;
__typeof(a) _a = (a)
__typeof(b) _b = (b)
三、【全局变量】
如果其他源文件要使用这个变量,就是在头文件中声明一下这个变量,extern 一下,这个就是全局变量了。
变量,未声明也会报错!!也需要声明!!!!!!!!!类似于函数一样。
如何声明变量?————extern
extern_struct FunctionInfo haizei_test_info;
和函数定义一样,别管在哪,我先告诉你有这个东西。
这就是声明一个变量,这个时候变量在哪别管,链接的时候,保证你可以找到这个变量的定义。
四、【浮点型的相等判断】
浮点型无法完全判断等,因此,判断输出正确率的字体颜色的时候,写 rate == 1.0会出错!!
可以这样写:fabs(rate - 100.0) < 1e-6
或者上述:haizei_test_info.success == haizei_test_info.total