c/c++ review
2018-09-26 21:52 CeddieCoding 阅读(272) 评论(0) 收藏 举报公司的代码实际上是通过某个程序从java转成c的,而我看的部分,在java上实际是用来模拟跑测试用例的,so,必须得复习复习c/c++了,不断补充吧
1.typedef
这真是个神器,尤其是用在定义函数时,我们可以这样用:
typedef void (*fun_ptr)(int); typedef void fun_val(int); typedef void* fun_ptr_rt(int*);
我们定义了三个类型,其中:
(1)fun_ptr为一个指针,指向一个函数,其返回值是void型,参数是int型
若有函数定义为:
void print(int val) { printf("%d\n", val); }
我们可以这样用fun_ptr:
fun_ptr f_ptr = print; f_ptr(1);// 效果等同于print(1)
(2)fun_val可以看做是一个函数的“别名”,函数的返回值是void型,参数是int型。接着上面的函数定义,我们可以这样用fun_val:
fun_val* f_val = print; f_val(1);// 效果等同于print(1)
(3)fun_ptr_rt其实和fun_val相似,不要被void*骗了,我把“*”写的靠近void就是表明这只是这个函数的返回值类型,函数的参数为int*
若有函数定义为:
void* print_ptr(int* a) { return (void*)a; }
我们可以这样用fun_ptr_rt:
fun_ptr_rt* f_ptr_rt = print_ptr; int val = 1; printf("%p\n", f_ptr_rt(&val));
(4)结果:
2.const和constexpr
(1)const:只能修饰object(这里是泛指的对象),const不分编译期常量和运行期常量,也就是说:
const int i = 42; // compile const int j = get_number(); // runtime
i和j都是常量,在初始化后不能被改变,只不过i是编译时初始化,j是运行时初始化。
(2)constexpr:能修饰object和method,其中对object的修饰,就意味着它是编译期常量:
constexpr int mf = 20; // mf is a const expression constexpr int limit = mf; // limit is also a const expession
对于method的修饰,返回值不一定是编译期常量:
constexpr int fibo(int n) { return 1 ? (n == 0 || n == 1) : fibo(n-1) + fibo(n-2); }
只有当n是常量表达式时,fibo的返回值才是编译期常量。也就是说,如果不是,那么fibo和普通函数没有区别。实际上,constexpr是在对编译器说:“我是编译时常量”,比如fibo(2),那么编译时编译期就会算出fibo(2)的值来代替fibo(2)
浙公网安备 33010602011771号