1.return:结束一个函数并返回其后面表达式中的值。初学的时候,有些不理解main 函数中return 0;有什么用,在写程序的时候老是忘记带上了。其实,带上return 0;是很有必要的。...程序中,函数test的返回值为指向局部变量num的指针,当主函数调用test函数的时候,返回ptr指针并且赋值给p指针变量,即num变量的地址赋给了p,但是必须明白,在test函数结束的时候,局部变量num...乍一看,和预期的一样,但是实际上,这样的程序是存在隐患的。下面改改这个程序,就知道错在哪了。 运行结果:15,7(也可能是15,9视具体环境而定。)在这里,多了个test2函数。...这时候就会把之前释放的那块空间给x,y再次分配使用,使用在赋值语句后,该空间的值发现了改变,使得*p发生了改变。所以,切记 return不能返回指向局部变量的类型。 2.void:为空类型。...例如该例中都是限定m为10)但是要注意一点,只读变量虽然值不能改变,但它还是变量,不是常量。如 int const M = 10; int a[M]; 这样定义数组是错误的。
打印内存模型 可以从打印结果看,第一个输出的数字是 1,与预期符合;第二个输出 97,很明显是字符 'a' 的 ASCII 码值,但是 p 怎么会指到 name 变量的地址里呢?...s 与 p 都代表一个地址,打印结果它俩相同,也是符合预期的。 那就见鬼了:既然 s 与 p 代表同一个内存地址,但是为什么用 *p 读取 int 型数据时,得到的却是字符 'a' 的值呢? 2....从现象上看,似乎是 printf 语句在执行过程中打印第一个数字之后,影响到了指针 p 的值,但是具体是怎么影响的说不清楚,而且它是系统里的库函数,肯定不能改变 p 的值。..., 30}; printf("%d %d %d \n", a, a, a);} 编译、执行,打印结果为:10 20 30,把 3 个成员变量的值都打印出来了,太诡异了!...因为栈中的所有动态参数被提取后,arg 的值为 0x01020310(最后一个参数的上一个地址),如果不设置为 NULL 的话,下面使用的话就得到未知的结果,为了防止误操作,需要设置为NULL。
打印内存模型 可以从打印结果看,第一个输出的数字是 1,与预期符合;第二个输出 97,很明显是字符 'a' 的 ASCII 码值,但是 p 怎么会指到 name 变量的地址里呢?...s 与 p 都代表一个地址,打印结果它俩相同,也是符合预期的。 那就见鬼了:既然 s 与 p 代表同一个内存地址,但是为什么用 *p 读取 int 型数据时,得到的却是字符 'a' 的值呢? 2....从现象上看,似乎是 printf 语句在执行过程中打印第一个数字之后,影响到了指针 p 的值,但是具体是怎么影响的说不清楚,而且它是系统里的库函数,肯定不能改变 p 的值。...{10, 20, 30}; printf("%d %d %d \n", a, a, a); } 编译、执行,打印结果为:10 20 30,把 3 个成员变量的值都打印出来了,太诡异了!...因为栈中的所有动态参数被提取后,arg 的值为 0x01020310(最后一个参数的上一个地址),如果不设置为 NULL 的话,下面使用的话就得到未知的结果,为了防止误操作,需要设置为NULL。
从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入, 不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。...,(不同的机器可能会有所差别) 可以看出,实参的地址为0x22ff44 采用值传递的时候,函数操作的地址是0x22ff20并不是实参本身,所以对它进行操作并不能改变实参的值 再看引用传递,操作地址就是实参地址...一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。 指针传递的实质: 指针传递参数本质上是值传递的方式,它所传递的是一个地址值。...指针变量在符号表上对应的地址值为指针变量的地址值,而引用在符号表上对应的地址值为引用对象的地址值。符号表生成后就不会再改,因此指针可以改变其指向的对象(指针变量中的值可以改),而引用对象则不能修改。...;(具体指没有int& const a这种形式,而const int& a是有 的, 前者指引用本身即别名不可以改变,这是当然的,所以不需要这种形式,后者指引用所指的值不可以改变) 引用不能为空
注意:要得到正确的值该圆默认是有中心的,个人注:说实话不明白这个函数有什么用 public boolean mapRect(RectF dst,RectF src) 用matrix改变src的4个顶点的坐标..., int pointCount) 将当前matrix的值设置为这样的值,对src变换后可以得到dst的数据,pointCount表示点的数目,只能是0-4。...,它有四个常量,每个常量应用后会导致matrix有什么结果呢,根据那4个常量的文字说明可知,CENTER,END,START表示得到的伸缩矩阵m,m对src进行变换后得到dst1,dst1跟src有同样的宽高比例...(px,py)在转换过程中不能改变。...()可能不能得到与初始化相同的数据。
先看预测结果(P|N),然后再针对实际结果对比预测结果,给出判断结果(T|F)。按照上面逻辑,重新分配后为 ? TP、FP、FN、TN可以理解为 TP:预测为1,实际为1,预测正确。...2.准确率 首先给出准确率(Accuracy)的定义,即预测正确的结果占总样本的百分比,表达式为 ? 虽然准确率能够判断总的正确率,但是在样本不均衡的情况下,并不能作为很好的指标来衡量结果。...5.F1分数 精确率和召回率又被叫做查准率和查全率,可以通过P-R图进行表示 ? 如何理解P-R(精确率-召回率)曲线呢?或者说这些曲线是根据什么变化呢? 以逻辑回归举例,其输出值是0-1之间的数字。...上图P-R曲线中,平衡点就是F1值的分数。 6.Roc、AUC曲线 正式介绍ROC和AUC之前,还需要再介绍两个指标,真正率(TPR)和假正率(FPR)。...因此我们从实际表现的各个结果出发,就能避免样本不平衡的问题,这就是为什么用TPR和FPR作为ROC、AUC指标的原因。
2. p值(统计显著度)和置信区间是为了计算绝对差异,但推断目标却是百分比改变(百分比提升)。因此,笔者用了恰当的p值和置信区间来表示百分比提升。...我们可以看到,115个测试中有18个测试结果重新评级︰ 根据GoodUI的定义,有︰ p值小于等于0.03为强结果,p值小于等于0.25为可能结果,p值大于0.25为不显著结果。...每一个评级结果都是连续的(例如若果p值为0.01,则测试的评级不能同时为强和可能)。...举个例子,一个有着实际上0.08p值的测试,在经过5次窥探后,就可以得到一个名义上的0.025 p值,这里实际上的p值大大偏离了0.05阈值,且是名义上的p值的3.2倍。...这里便出现了问题,因为我们不能简单地进行成对的t检定或z检定,就像GoodUI中对一个个变量和对照进行p值计算。
终端操作:会消费流,这种操作会产生一个结果的,如果一个流被消费过了,那它就不能被重用的。 中间操作:中间操作会产生另一个流。因此中间操作可以用来创建执行一系列动作的管道。...为参数,返回值是一个T类型(代表流中的元素类型)的对象。...accumulator代表操作两个值并得到结果的函数。...,并行流中,combiner方法被调用,将并行的累加器分别获得的结果组合起来得到最终结果。...// 2、18900 8900,说明这种写法并未改变原有personList。 3.5 排序(sorted) Sorted方法是对流进行排序,并得到一个新的stream流,是一种中间操作。
通过如图的代码,可以得到3个结论: 1.const如果在*左边,const修饰的是*p,也就是修饰指针指向的内容,保证指针指向的内容不能通过指针来改变,但是指针变量p本身的内容是可以改变的。...(*p=20是不可行的,p=&a是可行的) 2.const如果在*右边,const修饰的是p本身,保证指针变量p的内容不能被修改,但是指针指向的内容是可以改变的。...= '\0')//这里也可以写成*p,因为'\0'的ascii值是0 p++;//p加1一次就往后移动4个字节 return p - s;//指针-指针得到的绝对值是指针之间的元素个数(前提条件:...,此时再去访问得到的就是一个随机值。 ...如果该表达式为假(返回值为零), assert() 就会报错,在标准错误 流 stderr 中写⼊⼀条错误信息,显⽰没有通过的表达式,以及包含这个表达式的⽂件名和⾏号。
Person // Person{0, "", nil} 变量p只声明但没有赋值,所以p的所有字段都有对应的零值。...nil并不是Go的关键字之一,你甚至可以自己去改变nil的值: var nil = errors.New("hi") 这样是完全可以编译得过的,但是最好不要这样子去做。...那么为nil的指针有什么用呢?...sayHi() { fmt.Println("hi") } var p *person p.sayHi() // hi 对于指针对象的方法来说,就算指针的值为nil也是可以调用的,基于此,我们可以对刚刚计算二叉树和的例子进行一下改造...那么nil的map有什么用呢?
也就是说虽然指针变量的大小不会改变,但是它可以被类型给区分从而得出不同的操作结果。...其实const的使用是非常灵活的,它既可以放在*p又可以修饰p,其结果是不同的。...const* p = &n; *p = 20; p = &m; //A和B两种情况都将const放在*左边,此时限制的是*p 修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。...⾝,保证了指针变量的内容不能修改,但是指针指 向的内容,可以通过指针改变。...(3)传址调用 设想:通过函数来交换值 得到的结果是: 原因就是,形参和实参都有自己独立的空间,对于在函数内部形参的交换并不会影响到主函数内实参的变量的改变。对形参的影响是不会影响实参的。
预期结果: *global_instance is 200000000 画外音: 执行结果 不是预期结果,肯定不是线程安全的。 为什么还说内置安全的。...画外音 智能指针有2个成员,一个是引用计数是原子的,另外一个原始指针 不是 综合来说 就不是 继续查看文档shared_ptr_thread_safety Examples: 引用计数改变 原子操作...Writing different shared_ptr instances from two threads 引用计数改变 原子操作 安全 // thread A p.reset(new int(1912...为了简化并突出重点,后文只画出 use_count 的值: ? 以上是 shared_ptr x(new Foo); 对应的内存数据结构。...为什么用一个类来管理另外一个指针呢 提示: 聚合关系图: ? 组合关系图: ? 2. 共享指针缺点 提示: ? ?
但是在C++语言中,两者的区别没有那么简单: 左值表达式的求值结果是一个对象或者一个函数,但是以常量对象为代表的某些左值却不能作为赋值语句的左侧运算对象 虽然某些表达式的求值结果是对象,但是它们实际上是右值而不是左值...递增和递减运算符 前置版本和后置版本 后置版本也会将运算对象加/减一,但是求值结果是运算对象改变之前的值的副本。...运算得到指针你指向的对象所占空间的大小,指针本身不需要有效 对数组执行sizeof运算得到整个数组所占空间的大小,等价于对数组中所有的元素各执行一次sizeof运算并将所得结果求和 对string对象或...void*指针中的值: void* p = &d; double *dp = static_cast(p); const_cast const_cast只能改变运算对象的底层const...= const_cast(pc); // 正确,但是通过p写值是未定义的行为 reinterpret_cast 使用reinterpret_cast是非常危险的,主要是因为类型改变了但是编译器没有给出任何警告或者错误的提示信息
CAS操作过程就是将内存中的将要被修改的数据与预期的值进行比较,如果这两个值相等就修改值为新值,否则就不做操作也就是说CAS需要三个操作值: 预期值的 A 内存中的V 将要修改的B 简单的来说CAS就是一个死循环...,在循环中判断预期的值和内存中的值是否相等,如果相等的话就执行修改,如果如果不相等的话就继续循环,直到执行成功后退出。...CAS的问题 CAS虽然很牛逼但是它也存在一些问题比如ABA问题,举个例子,现在有内存中有一个共享变量X的值为A,这个时候出现一个变量想要去修改变量X的值,首先会获取X的值这个时候获取的是A,然后使用CAS...这样看起来是没有问题,那如果在线程1获取变量X之后,执行CAS之前出现一个线程2把X的值修改成B然后CAS操作执行又修改成了了A,虽然最后执行的结果共享变量的值为A但是此A已经不是线程1获取的A了。...它允许一个资源可以被多个读操作访问,或者被一个 写操作访问,但两者不能同时进行。
":"小饭"} 但是我们实际运行一下返回的结果却是 {"Name":"小饭","Age":0} 这明显是不符合我们的预期的,因为Age字段是我们不需要的。...「没有初始化结构体的任何属性」,所以转换成json之后的打印结果应该是只有{"Num":5}的,但是我们实际运行之后发现打印的结果却是 {"Num":5,"Person":{"Name":"","Age...为什么用指针类型就可以解决这个问题?因为「指针是基本类型,Golang知道他的空值是啥」,所以就直接赋值为nil(指针类型的空值)。...{ Per := Person{ Age: 0, } res, _ := json.Marshal(Per) fmt.Println(string(res)) } 按照咱们的预期,应该给输出...「因为Golang把0当成了零值,所以跟没有赋值是一样的」如果想解决这种问题一种方法是「使用int指针」,因为int指针的空值为nil,当我想输出0的时候,我传进去地址,地址肯定不是空值nil,这样肯定会显示出来
领取专属 10元无门槛券
手把手带您无忧上云