C++ 的6个冷门但有用的知识点

C++ 6个冷门但有用的知识点

  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位的整型,不过大部分平台还是有的¹。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值