原文:C++ 容易忘的基本语法和特性
作者:Breaker <breaker.zy_AT_gmail>
标准 C++ 中容易忘记但比较重要和常用的基本语法和特性
这是 C++ 或 C in C++,而不一定是传统 C 语言的语法和特性
零 0
字面量 0 是基本类型自动适应的,指针请直接使用 0 而不是 NULL 宏,如:
stddef.h 中支持老代码的 NULL 定义:
数组
由初始化自动确定大小
字符串字面量等价于数组 {}:
{} 和 "" 仅用于数组初始化,不能赋值,如:s3[8] = "123",请用 strcpy(), memcpy()
数组大小
sizeof: 操作符取得对象和数组的字节大小(变量或类型)
_countof: 取得数组的元素个数,只应用于数组而非指向数组的指针,在 VC 的 stdlib.h 中定义(C++ 用模板,C 用宏定义),等价于 sizeof(a)/sizeof(a[0])
数组尾哨兵元素位置
C++ 编译和运行环境保证,数组最后一个元素之后的一个元素的位置(地址)总是可以访问的,但不保证此地址单元内容可读写
与此相对,不保证数组第一个元素之前的一个元素的位置(地址)可以访问,这鉴于对象、数组的内存边界对齐放置
数组 a[N] 的尾哨兵地址:&a[N], a + N, a + _countof(a)
STL 算法因此可以操作内部数组:
数组和指针
数组名/指针 + 整数 offset,是以数组 元素单元 为单位
指针和大小类型
请使用以下而不是其它 int 类型,保证 32/64 bit 移植性
这些类型在 stddef.h, cstddef (namespace std), crtdefs.h 中定义
- size_t: unsigned, sizeof 的结果 字节大小类型, 指针/地址值, 数组下标或元素个数
- ptrdiff_t: signed, 指针/地址的差值
- uintptr_t: unsigned, 指针/地址值, 同 size_t
- intptr_t: signed, 指针/地址的差值, 同 ptrdiff_t
STL 标准库中的很多大小和指针差值类型都是 size_t 和 ptrdiff_t 的别名,如分配器 std::allocator 中:
printf 打印指针地址
用 32/64bit 整数自定适应前缀 I,对应 ptrdiff_t (signed) 或 size_t (unsigned)
用 printf 的变长宽度格式化 *
32bit 输出:0x00000001
64bit 输出:0x0000000000000001
字符串字面量
其类型是 const char_type[N] 数组,N 算上最后结尾 0 字符
大小
"hello": 类型是 const char[6], sizeof() = 6
L"abc中文123": 类型是 const wchar_t[9], sizeof() = 18
"": 类型是 const char[1], sizeof() = 1
常量性
请以 const char_type* 或数组作为字符串字面量的初始化、赋值左值
有些编译器警告报错非 const 的 char_type* 初始化、赋值 (GCC),但有些编译时不报错 (VC)
正确的习惯:
转义字符
拼接
编译阶段拼接,空白字符: 空格, TAB, 换行符
链接方式
字符串字面量的链接方式 (internal linkage) 默认使用内部链接方式,相当于使用 static 修饰
以指针类型的模板参数只能使用指向外部链接对象的指针为例:
哪些可以作为 str_func 的模板参数 str_func<Hello>
结构体初始化
{} 用于初始化 POD 结构和数组,可以嵌套,常用这种方法初始化程序启动时的配置数据
一旦 struct/class 中有自定义的构造函数,则不能再用 {} 初始化
名字空间别名
名字空间可以嵌套,如果名字空间很长可以用别名代替,我习惯用 _n1_n2_n3 的短别名:
请在较小作用域内进行名字空间导入、短别名代替,切忌放到 .h 中,防止影响范围扩散
for 循环中的 continue 会执行步进语句
以删除 vector 中特定元素为例,i++ 不能放到 for 的步进语句中:
bool 表达式短路求值
expr1 && expr2: 只在 expr1 = true 时,才会对 expr2 求值
expr1 || expr2: 只在 expr1 = false 时,才会对 expr2 求值
这种技巧惯用在后边的语句依赖前面语句的时候,如:
分享到:
相关推荐
c++语法与pascal语法的比较 PPT格式
C++的词法和基本语法 讨论C++语言的基本语法规则,包括:字符 集、标识符、保留字、操作符、表达式等。 标识符、保留字、操作符、表达式等。 上述内容大多属于C++ 的词法和基本语法, 上述内容大多属于 C++的词法和...
语法分析器语法分析器语法分析器语法分析器语法分析器语法分析器语法分析器语法分析器语法分析器
C++ 。NET入门的一些歌规则 C++ .NET CLI 编程入门的一些歌规则
从零开始学习C++,讲诉C++语法,并附带大量实例源码,源码经过编译验证
SqlParser C++实现的SQL语法解释器,忘了在哪找到的,方便大家学习,直接贴上来了
提供了c++大部分的语法,足够初学者的需求。也适合有一定c++基础的人学习!
在C语言的基础上,学习C++编程,此60道实例详解的讲解了C++编程基本语法知识,通过这些实例把握C++编程的基本语法
这份学习资料提供了C++基本语法和操作的学习资源,包括在线教程和推荐书籍。通过阅读这些资源并编写示例代码,您可以快速入门并掌握C++的基本知识。 学习资源中的在线教程提供了基础知识的讲解和示例,适合初学者...
c++基本语法,面向对象程序设计。教学PPT..
此视频教程是面向入门新手的,能够激发你对编程的兴趣.共同进步!
C++实现的语法和语义分析/C++实现的语法和语义分析
java和c++语法区别语法上的比较,也举出了一些相同点
C++考试,语法基础
C++语法介绍,适合初学者学习,非常详细介绍了C++里涉及到的语法规则,对学习很有帮助
C++语法详解》对C++的语法进行了全面介绍和深入讲解,内容包括:C++整型、字符型、浮点型、声明、定义、typedef、运算符、表达式、左值、选择语句、循环语句、指针、数组、函数和标识符的作用域、类基础、类作用域及...
不仅通过大量的实例代码讲解特性的概念和语法,还从编译器的角度分析特性的实现原理,还穿插了C++标准委员会制定特性标准时的一些小故事,帮助读者知其然也知其所以然。 本文档适合因为工作需要学习C++新特性的C++...
C++语法和VS番茄插件,C++初学者的福音。
以前课程设计做的C++的语法分析程序,功能比较简单,有详细注释,容易理解
通过LR分析表及三个栈形成对输入表达式的判断! 。