在学习C语言的过程中,我们都自己总结了一些重要的知识点,但是有些不常用的冷门知识点可能就被我们选择性忘记了,你要不要来回一下呢?
1:int跟signed int是一回事,short、long亦然,但char不是。
char、signed char、unsigned char在逻辑上是三种类型,比较直观的体现就是在C++的重载中,你可以定义参数类型分别为它们的三个同名函数。但实现上的类型只有两种,char可能是signed也可能是unsigned的,看编译器实现,现在很多编译器默认是signed,但可以通过选项配置或参数指定为unsigned。
2:你是否已经习惯了“\xHH”这种两个H的写法的16进制换码序列?
但实际上C规定H可以任意多的。
例如:
cout << strlen("\x0012") << endl;
不过如果后面数字太大,是有可能出现溢出的情况,不同编译器处理方式不同,gcc会报错,vc是截取末尾4字节。
可以试试:
cout << "\x1234567890000000000000000000041" << endl;
那如果我想要\x00、1、2这仨字符组成的字符串字面量呢?可以这样写:"\x00""12",多个字面量连着写,会帮你连起来。
3:字符串!!!
很多语言都支持用反斜杠放在行尾来折行,C++也可以,不过这种代码:
cout << "hello \\
tony" << endl;
有人可能会认为编译失败,因为行尾的反斜杠被前面一个转义了,但实际上一些编译器(比如gcc)并不会到词法分析阶段来搞这个事情,采用了非常粗暴的方式:直接读入源文件然后将里面的"\\\n"替换为空串,然后再开始编译,所以上面的代码其实等于:
cout << "hello \tony" << endl;
第一个反斜杠跟第二行的t连起来,就是tab符了。
4:还是字符串!!!
C语言以前有三字符换码序列,比如??=表示#等,不过现在很多编译器已经不想支持这种东东了,比如新的gcc会给出个warning,新标准好像也不打算支持了,据说是因为IBM的字符集和老的一些键盘没有#之类的字符,很多老代码是这种形式写的,这个特性的去留问题后面还引起争论,有大佬直接说你们换个新键盘就好啦。
5:C语言的sizeof是一个关键字!!!
sizeof是前缀单目运算符,而不是函数。
这意味着你可以直接写:
cout << sizeof 1 << endl;
然后,强制类型转换运算、指针解引用运算也是前缀单目运算符,而我们知道前缀单目运算符是右结合的,那么这个式子:
sizeof(int)*p
应该解释为:对指针p解引用,然后强制转换为int类型,然后取sizeof咯?哈哈哈
虽然逻辑严谨,但其实不是的,因为还有特殊规定:sizeof后面如果是一个强制类型转换的表达式,则必须加括号,所以不用担心,上面的代码是int的大小乘以p
最好还是给所有sizeof加上括号吧。。。
6:大家是不是都习惯用stdint.h中的int32_t这些类型了,很多资料也推荐用,但这些类型其实是optional的,就是说可能是不提供或缺失,例如ILP64模型下,就没有32位的整型,不过大部分平台还是有的!!!
完
关注它,
你就可以得到
很多你想要的C/C++
开发工具及学习视频资料