C++ 疑问 ; 请问这个的作用是什么 还有 ret是什么
作者&投稿:聂茜 (若有异议请与网页底部的电邮联系)
cap.read()返回两个参数赋给两个值。第一个参数ret的值为True或False,代表有没有读到图片。第二个参数是frame,是当前截取一帧的图片。
原版来源于niushengqi 这个是在STL编程时候才用的,梯形图中系统自己会加上了,就是返回指令,return,就是从子程序返回到主程序中,调用多个子程序就要多个RET.
float daPower(float x,int n)这个代码应该是计算x的n次幂,不过写的挺乱的
ret只是一个作为返回值的临时变量而已,只是单词“return”的缩写(我是说单词return,和return语句没关系)
float ret=1,tmp;
if(n==1)return x;//如果n为1,就代表是求某个数的1次幂,一个数的1次幂肯定是这个数本身,能理解吧
tmp=daPower(x,n>>1);//如果上条语句没返回就到这里,n>>1就是右移一位,一般可以理解为n/2
ret=tmp*tmp;//上面是把n/2,可是求的还是次幂,所以要把结果再乘一次,例如x的10次幂等于,x的5次幂乘以x的5次幂,理解了吗?
if(n&1)ret*=x;//这条语句的意思是,假设n是奇数,那么再乘一边x,意思就是假设n为5,那么n>>2就为2,两个x的2次幂相乘的结果是n的4次幂,我们要求5次幂,所以这里再乘一次
return ret;
总而言之⋯⋯很莫名其妙的算法
这是快速幂的求法~就是求实数x的n次方是多少
ret是一个返回值,最后返回的ret就是x的n次方
举个最简单的例子:
比如我们要求2的100次方,常规做法是将2自乘100次,对吧?但这个程序只要乘7次就可以啦~(运算级别降到了log2 100这么少!)
它的运行方法是:2^100=2^50×2^50,而2^50=2^25×2^25,以此类推,那么对于2^100来说,我们只要用tmp记录一个2^50,再返回tmp*tmp就可以了(也就是上述程序的ret=tmp*tmp的作用)
再解释一下tmp=daPower(x,n>>1)的意思,n>>1的意思就是n二进制中右移一位(什么那么复杂啦,就是除以2取整数嘛!)也就起到了算2^100只要算2^50次方(50由100>>1也就是除以2得到)的作用,至于最麻烦的if(n&1)ret*=x的话嘛~就是一种特殊情况:
首先if(n&1)是判断n是不是奇数,(是把n转成了二进制,判断最后一位是否是1,是1就表示是奇数,不信你试试奇数二进制下最后一位是不是1?)如果是奇数就看下面:
比如我们算2^101,101不是偶数,不能单纯地101>>1再自乘得到,而要算出2^50,然后再自乘一个2得到,也就是2^101=(2^50)×(2^50)*2,所以有了if(n&1)ret*=x;(相当于ret=ret*x;)这一句话了~最后就返回个ret
再介绍点好玩的东西,为什么返回值是ret不是ter或者别的什么呢?因为return这个单词前三个字母就是ret!为了方便记忆说等一下我要返回值,所以很多人都把返回值用ret作变量!谢谢~
float daPower(float x,int n)
{
float ret=1,tmp;
if(n==1)return x; //剩下1次方的时候,才是递归函数终止条件
tmp=daPower(x,n>>1);
ret=tmp*tmp;
if(n&1)ret*=x;
return ret;
}
这个函数是求 x^n,也就是x的n次方,ret就是所求的返回值,由于这个函数用了移位,和递归,理解这个算法上就需要一定的数学功底
随便举个例子
假设调用的是 float daPower(2.1, 31),也就是2.1的31次方
这个算法的过程就是
float daPower(2.1,31)
{
float ret=1,tmp;
if(n==1)return x; //因为 n=31,所以此分支没有进来
tmp=daPower(x,n>>1); //n>>1就是n/2,所以tmp的值就是 2.1的15次方,递归调用
ret=tmp*tmp; //ret= tmp*tmp bn就是2.1的 30次方
if(n&1)ret*=x; //因为n是31,所以此分支进入 ret*=x; 也就是2.1的31次
return ret;
}
奚眉丽扶: 因为字符串都是以'\0'结束的.程序中加的那句是怕上面循环中的最后一个字符非'\0',如果为非,则字符串就会出错.所以他只是起一个维持数据安全的作用.
祁县18856982129: C++ 疑问 ; 请问这个的作用是什么 还有 ret是什么 - ?
奚眉丽扶: 这是快速幂的求法~就是求实数x的n次方是多少 ret是一个返回值,最后返回的ret就是x的n次方 举个最简单的例子: 比如我们要求2的100次方,常规做法是将2自乘100次,对吧?但这个程序只要乘7次就可以啦~(运算级别降到了log2 100这么少...
祁县18856982129: C++这个<<符号有什么意义 用法? - ?
奚眉丽扶: <<在c++中有两种用途.1.用于C++的I/O流的输入和输出中的输出,也就是用在cout中,它是一个提取运算符,表示把一个东西输出到标准输出设备比如显示器,如:cout<<"哈哈,哈哈!",此时就会在屏幕上输出:哈哈,哈哈!和输入流中的cin>>相对应.<<运算符是可以重载的.2.它作为逻辑运算中的左移运算符,表示把它左边的操作数左移n位,比如 a<<3;就表示把a的二进制表示方式左移3位,a左边移动的三位丢弃,后边空出的三位用0补充.希望对你有帮助!
祁县18856982129: C++问题,“#define - POINT - H“是干啥用的? - ?
奚眉丽扶: #define _POINT_H在这里就是表示我把 _POINT_H define过了 因此前面才有这个#if !defined(_POINT_H)#if !defined(_POINT_H)这句表示如果_POINT_H没有被define过就定义那个类 如果_POINT_H被define的话,就不用定义那个类了
祁县18856982129: c++的用处是什么 - ?
奚眉丽扶: 用处很多了,比如编写系统等等 先打好你的基础再说,比如C/C++,比如数据结构,比如操作系统,比如算法.其它的等基础打好再说也不迟. 举个例子: 刚开始学C++,->感觉C++,学得差不多->感觉C++,学得不错了->感觉C++,还有好多东西要学->感觉自己的C++,还是太菜->感觉自己的C++,刚入门->感觉C++,学得还行 经过这个阶段以后,你就真的算学好了. 关键是要努力+勤奋+多看代码+多写代码
祁县18856982129: 请问c++的主要用途是什么 - ?
奚眉丽扶: 个人建议学c++ 虽然说比较难,但是真正编系统软件,比较大型的软件就要用它?~~ 而且他是面向对象的
祁县18856982129: c++重载运算符的作用是什么? - ?
奚眉丽扶: 就是可以定义新的运算方法,比如虚数的+、-法,你定义2个虚数,直接用+是不行的,系统不认,你必须自己写个重载,让实部和实部相加,虚部和虚部相加,你先了解下什么叫函数重载就能更好理解了.
祁县18856982129: C++问题,这个类的功能是什么? - ?
奚眉丽扶: 创建窗口吧 win32入口函数的抽象吧
祁县18856982129: 请问这句C++代码的作用 - ?
奚眉丽扶: 你那个__PAIR__应该是前面定义的,第二行代码是对位进行操作,我大概解释一下&是位与,就是两个数化成二进抽,每一位进行与操作+就是位相加,-就是按位相减>>就是按位向右移一位,右边移走的不要了,左边高位补0 c++中有pair的用法,意思是把两个参数组合成一个参数.你这里的__PAIR__应该是前面已经定义好的,目的是把后面紧跟的括号里两个数当成一组看待,这样__PAIR__-__PAIR__时就可以把里面参数分别相减
祁县18856982129: 这个C++函数的作用是什么(内详)?
奚眉丽扶: 如果没有第二个函数的话,就无法使用后自增操作了.不过应该写Fraction y = *this; 可以用如下代码检验:int main() { Fraction f(2,3); f.Output();(++f).Output();(f++).Output(); f.Output(); }