盘锦做网站谁家好,网站策划书结尾,织梦网站怎么做301,wordpress evolve数组隐式转换为指针
size_t func(int a[10]) {return sizeof(a);
}int a[100];
func(a); // 指针大小
sizeof(a); // 数组大小函数的参数看似是一个数组形式#xff0c;但事实上他已经退化为指针了#xff0c;也就是等价于size_t func(int* a)#xff0c;而数组作为参数传…数组隐式转换为指针
size_t func(int a[10]) {return sizeof(a);
}int a[100];
func(a); // 指针大小
sizeof(a); // 数组大小函数的参数看似是一个数组形式但事实上他已经退化为指针了也就是等价于size_t func(int* a)而数组作为参数传递给该函数时也会隐式转化为指针。
因此上述函数的返回值是指针大小而不是数组大小多么反直觉呀初出茅庐的我曾因此而犯错。
类型不是从左向右说明
int a;
int b[10];a的类型是int而b的类型是int[10]。到目前为止我们还是能轻松的辨别变量的类型不许骄傲再看看下面的定义
int *a[10];
int (*b)[10];此时是不是有点困惑它们该是什么类型呢
首先a的类型是数组长度为10元素类型是int*b的类型是指针指向int[10]的数组。
你会发现它们的类型一会儿从右向左一会儿从内向外。反正就是非常的不直观我每次都能记住但时间一长也就忘了希望这次能记得久点。
类型的隐式转换
这应该算是最令人头疼的问题之一了如下的代码也许大家都遇到过:
if (val 2) {// 我能日赚斗金的逻辑
} else {// 我怎么实现一夜暴富
}想必大家很容易就看到了val 2这行神奇的代码了那么它的神奇之处在哪呢
首先我们知道C的赋值操作会返回该对象本身所以这行神奇代码的返回值就是val那么问题就显而易见了val会隐式转换为bool类型因为值是2所以永真那么也就意味着我不能实现一夜暴富了只能老老实实日赚斗金了其实也不错嘿嘿。这就是赋值操作带返回值以及隐式类型转换带来的问题。
这种错误我偶尔也会触犯一时难以发现最后发现了也只会令我更加痛苦为啥会写出如此愚蠢的bug没有一点成就感。
对地址的直接操作
C的指针在使用上是何其的自由哇有了指针我觉得我就是造物主了我能随意操纵一切苦笑。实际上呢自由操作指针也同样带来了巨大的风险请看下面代码
int* a new int[10];
int* p a;
// 一堆莫名其妙的逻辑
int b *(p 10);这种错误一看就明白但是工作中一写代码保不齐哪里就写越界了然后代码运行前我们还察觉不到你说气人不气人。所以还是要尽量避免直接操作裸指针更应该避免通过指针偏移来操作指针。
后置的自增自减
后置的自增和自减操作虽然从直觉上来看和前置的没啥区别都是让自身的值1/-1然而实际的内部实现上却有着些许差异但就是这种差异却也会带来性能上的损耗。
MyObject a;
a; // 返回a自加前的副本
a; // 返回a本身我的对象是咋样的就不在此展示了直接说结论后置的自增/自减会返回一个自增/自减之前的副本所以会存在一次额外的构造和析构操作。而前置的自增/自减则是返回该对象本身所以没有额外开销。因此有时候不经意间写了后置的自增/自减就有可能导致软件的性能降低。
总结
很明显我对C的思考仅限于C语言本身至于其他语言我很少涉及因此不能够通过与其他语言的对比中发现C更多的不足。因为不知道别人有多好所以我总以为C给予我的就是它最好的但事实上它也有很多缺陷。当然一切相遇都是最好的安排既然选择了C那它就是最好的不忘初心学好C方得始终。