一,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 | , |
逗号 | 从左到右 逗号 |
分析表达式时,运算符的优先级与结合性影响表达式中运算对象组合的方式。
记忆口诀:单目右、单目左、算术、关系、逻辑单、逻辑双、逻辑三、赋值、逗号。