一,C 与 C++ 不同
C++ 通常被认为是C的增强版. C++ 通常被认为是“C with class”, 这一点在C++创立之初非常正确, 但是随着时间的推移,C增加了很多特点,其中某些C++没有,总的来说C++是 C 加上 Object-Oriented Programming(面向对象编程), Exception Handling(异常处理), 模板, 于此同事C++更耗资源.
| Parameter | C | C++ |
| 编程规则 | C 面向过程 | 面向对象. |
| Approach | C follows a top-down approach | C follows the bottom-up approach. |
| 关键字长度 | 32 | 63 |
| 数据类型 | C 仅支持内置数据类型 | 支持用户typedef 数据类型,注意和#define宏不同 |
| 头文件 | <stdio.h> | <iostream.h> |
| 内存分配/释放 | calloc(),malloc() /free() | new operator /delete operator |
| 访问权限(OOP) | 不支持 | 支持protected,public,private修辞 |
| 安全性(OOP) | 不支持 | 支持数据隐藏封装 |
| 引用变量 | 不支持 | 支持 void function(int &n) |
| 函数重载/覆盖 | 不支持 | 支持 |
| 异常处理 | 不支持 | 支持 try – catch block |
| 程序部分 | C 是面向过程的, 所以C程序可以划分成函数块 | C++ 是面向对象的, 所以C++程序可以划分成类块 |
| 内联函数 | 不支持 | 支持 |
| 兼容性 | C代码可以用C++编译器编译 | C++代码不可以用C编译器编译 |
| 标准输入/输出 | scanf() /printf() | cin / cout |
| 适用范围 | 网络驱动、文本编辑器、汇编器等底层实现 | 适合于高级实现,如游戏开发、智能手表、嵌入式系统等 |
| 命名空间 | 不支持 | 支持 |
二,extern “C”{}作用
1.C++调用C
这种情况仅仅需要高速C++编译器 调用的函数是C格式的,一般需要在.c文件的头文件加 #ifdef __cplusplus extern “C” { #endif,如下
#ifdef __cplusplus
extern "C" {
#endif
............code.......
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus这个条件宏保证了,c编译器不受影响,gcc编译.o文件链接格式是C语言格式,g++链接.o里面的文件需要知道.o里面的函数是c语言格式的.引用c的头文件g++编译器就知道了
2.C调用C++
C如果要调用C++函数,那么C++函数必须用C格式去编译,故cpp文件函数也要声明函数按照C格式编译
//头文件 *.h
#ifdef __cplusplus
extern "C" {
#endif
void fun(int);
#ifdef __cplusplus
}
#endif
//cpp文件 *.cpp
extern "C" void fun(int)
{
}
头文件的extern “C” 保证其它cpp文件调用这个函数都知道是按照C格式编译,cpp的extern “C”保证g++ 按照c的格式去编译这个函数
三,算术优先级
下表列出 C++ 运算符的优先级和结合性。各个运算符以优先级的降序从上至下列出。
原文
| 优先级 | 运算符 | 描述 | 结合性 |
|---|---|---|---|
| 1 | :: |
作用域解析 | 从左到右 单目右 |
| 2 | a++ a-- |
后缀自增与自减 | |
type() type{} |
函数风格转型 | ||
a() |
函数调用 | ||
a[] |
下标 | ||
. -> |
成员访问 | ||
| 3 | ++a --a |
前缀自增与自减 | 从右到左 单目左 |
+a -a |
一元加与减 | ||
! ~ |
逻辑非和逐位非 | ||
(type) |
C 风格转型 | ||
*a |
间接(解引用) | ||
&a |
取址 | ||
sizeof |
取大小[注 1] | ||
co_await |
await 表达式 (C++20) | ||
new new[] |
动态内存分配 | ||
delete delete[] |
动态内存分配 | ||
| 4 | .* ->* |
成员指针 | 从左到右 算术: |
| 5 | a*b a/b a%b |
乘法、除法与余数 | |
| 6 | a+b a-b |
加法与减法 | |
| 7 | << >> |
逐位左移与右移 | |
| 8 | <=> |
三路比较运算符(C++20 起) | 从左到右 关系 |
| 9 | < <= |
分别为 < 与 ≤ 的关系运算符 | |
> >= |
分别为 > 与 ≥ 的关系运算符 | ||
| 10 | == != |
分别为 = 与 ≠ 的相等性运算符 | |
| 11 | & |
逐位与 | 从左到右 逻辑单 |
| 12 | ^ |
逐位异或(互斥或) | |
| 13 | | |
逐位或(可兼或) | |
| 14 | && |
逻辑与 | 从左到右 逻辑双 |
| 15 | || |
逻辑或 | |
| 16 | a?b:c |
三元条件[注 2] | 从右到左 逻辑三 赋值 |
throw |
throw 运算符 | ||
co_yield |
yield 表达式 (C++20) | ||
= |
直接赋值(C++ 类默认提供) | ||
+= -= |
以和及差复合赋值 | ||
*= /= %= |
以积、商及余数复合赋值 | ||
<<= >>= |
以逐位左移及右移复合赋值 | ||
&= ^= |= |
以逐位与、异或及或复合赋值 | ||
| 17 | , |
逗号 | 从左到右 逗号 |
分析表达式时,运算符的优先级与结合性影响表达式中运算对象组合的方式。
记忆口诀:单目右、单目左、算术、关系、逻辑单、逻辑双、逻辑三、赋值、逗号。
Mr.Zhang
