C++ åèæå
- C++11
- C++14
- C++17
- C++20
- C++ ç¼è¯å¨æ¯ææ åµè¡¨
- ç¬ç«ä¸å®¿ä¸»å®ç°
- C++ è¯è¨
- å鿍¡æ¿(C++14 èµ·)
- æ´æ°åé¢é
- èååå§å
- æ¯è¾è¿ç®ç¬¦
- é»è®¤æ¯è¾(C++20 èµ·)
- 转ä¹åºå
- for 循ç¯
- while 循ç¯
- ç¨æ·å®ä¹è½¬æ¢
- SFINAE
- 䏻彿°
- ASCII ç 表
- æ è¯ç¬¦
- ç±»å
- å 忍¡å
- 对象
- åºæ¬æ¦å¿µ
- 表达å¼
- 声æ
- åå§å
- 彿°
- è¯å¥
- ç±»
- è¿ç®ç¬¦éè½½
- 模æ¿
- å¼å¸¸
- äºå¡æ§å å
- å ä½ç¬¦ç±»å说æç¬¦ (C++11 èµ·)
- decltype 说æç¬¦
- 彿°å£°æ
- final 说æç¬¦ (C++11 èµ·)
- override 说æç¬¦(C++11 èµ·)
- å¼ç¨å£°æ
- ç§»å¨æé 彿°
- ç§»å¨èµå¼è¿ç®ç¬¦
- æä¸¾å£°æ
- constexpr 说æç¬¦(C++11 èµ·)
- å表åå§å (C++11 èµ·)
- æé 彿°ä¸æååå§åå¨å表
- using 声æ
- nullptrï¼æéåé¢é
- åºç¡ç±»å
- ç±»åå«åï¼å«å模ç (C++11 èµ·)
- å½¢åå
- èåä½å£°æ
- å符串åé¢é
- ç¨æ·å®ä¹åé¢é (C++11 èµ·)
- 屿§è¯´æç¬¦åºå(C++11 èµ·)
- Lambda è¡¨è¾¾å¼ (C++11 èµ·)
- noexcept 说æç¬¦ (C++11 èµ·)
- noexcept è¿ç®ç¬¦ (C++11 èµ·)
- alignof è¿ç®ç¬¦(C++11 èµ·)
- alignas 说æç¬¦ (C++11 èµ·)
- åå¨ç±»è¯´æç¬¦
- åºäºèå´ç for å¾ªç¯ (C++11 èµ·)
- static_assert 声æ
- éå¼è½¬æ¢
- 代ç¨è¿ç®ç¬¦è¡¨ç¤º
- èªå¢/èªåè¿ç®ç¬¦
- æå 表达å¼(C++17 èµ·)
- 类模æ¿å®åæ¨å¯¼(C++17 èµ·)
- 模æ¿å½¢å䏿¨¡æ¿å®å
- if è¯å¥
- inline 说æç¬¦
- ç»æåç»å®å£°æ (C++17 èµ·)
- switch è¯å¥
- å符åé¢é
- å½å空é´
- æ±å¼é¡ºåº
- å¤å¶æ¶é¤
- consteval 说æç¬¦ (C++20 èµ·)
- constinit 说æç¬¦ (C++20 èµ·)
- åç¨ (C++20)
- 模å (C++20 èµ·)
- 约æä¸æ¦å¿µ (C++20 èµ·)
- new 表达å¼
- do-while 循ç¯
- continue è¯å¥
- break è¯å¥
- goto è¯å¥
- return è¯å¥
- 卿å¼å¸¸è¯´æ
- throw 表达å¼
- try å
- å½å空é´å«å
- 类声æ
- cvï¼const ä¸ volatileï¼ç±»åéå®ç¬¦
- é»è®¤åå§å
- å¼åå§å(C++03 èµ·)
- é¶åå§å
- å¤å¶åå§å
- ç´æ¥åå§å
- 常éåå§å
- å¼ç¨åå§å
- å¼ç±»å«
- C++ è¿ç®ç¬¦ä¼å 级
- å¸å°åé¢é
- æµ®ç¹åé¢é
- typedef 说æç¬¦
- æ¾å¼ç±»å转æ¢
- static_cast 转æ¢
- dynamic_cast 转æ¢
- const_cast 转æ¢
- reinterpret_cast 转æ¢
- delete 表达å¼
- æé 彿°ä¸æååå§åå¨å表
- this æé
- 访é®è¯´æç¬¦
- åå 声æ
- virtual 彿°è¯´æç¬¦
- explicit 说æç¬¦
- éææå
- é»è®¤æé 彿°
- å¤å¶æé 彿°
- å¤å¶èµå¼è¿ç®ç¬¦
- ææå½æ°
- 类模æ¿
- 彿°æ¨¡æ¿
- æ¾å¼ï¼å ¨ï¼æ¨¡æ¿ç¹å
- æ±ç¼å£°æ
- C++ çåå²
- ä½ç¨å
- çåæ
- å®ä¹ä¸åä¸å®ä¹è§åï¼ODRï¼
- å忥æ¾
- æéå®çå忥æ¾
- æ éå®çå忥æ¾
- å¦åè§å
- æªå®ä¹è¡ä¸º
- ç¿»è¯é¶æ®µ
- 常é表达å¼
- èµå¼è¿ç®ç¬¦
- ç®æ¯è¿ç®ç¬¦
- é»è¾è¿ç®ç¬¦
- æå访é®è¿ç®ç¬¦
- å ¶ä»è¿ç®ç¬¦
- sizeof è¿ç®ç¬¦
- typeid è¿ç®ç¬¦
- æé声æ
- æ°ç»å£°æ
- è¯è¨é¾æ¥
- 详述类å说æç¬¦
- é»è®¤å®å
- åé¿å®å
- å®åä¾èµæ¥æ¾
- éè½½å³è®®
- éè½½å½æ°çå°å
- æ³¨å ¥ç±»å
- ééææ°æ®æå
- ééææå彿°
- åµå¥ç±»
- æ´¾çç±»
- 空åºç±»ä¼å
- æ½è±¡ç±»
- ä½å
- è½¬æ¢æé 彿°
- æå模æ¿
- 模æ¿å®åæ¨å¯¼
- é¨å模æ¿ç¹å
- sizeof... è¿ç®ç¬¦
- å¾ å³å
- 彿° try å
- æ©å å½åç©ºé´ std
- åæ¯ç¼©å
- RAII
- ä¸/äº/é¶ä¹æ³å
- PImpl
- é¶å¼éåå
- ç±»å
- éå¼è½¬æ¢
- 注é
- C++ å ³é®è¯
- é¢å¤çå¨
- C++ æ ååºå¤´æä»¶
- å ·åè¦æ±
- åè½ç¹æ§æµè¯ (C++20)
- å·¥å ·åº
- ç±»åæ¯æï¼åºæ¬ç±»åãRTTIãç±»åç¹æ§ï¼
- æ¦å¿µåº (C++20)
- é误å¤ç
- 卿å å管ç
- æ¥æåæ¶é´å·¥å ·
- å符串åº
- 容å¨åº
- è¿ä»£å¨åº
- èå´åº (C++20)
- ç®æ³åº
- æ°å¼åº
- è¾å ¥/è¾åºåº
- æä»¶ç³»ç»åº
- æ¬å°ååº
- æ£å表达å¼åº
- ååæä½åº
- çº¿ç¨æ¯æåº
- å®éªæ§ C++ ç¹æ§
- æç¨çèµæº
- ç´¢å¼
- std 符å·ç´¢å¼
- åç¨æ¯æ (C++20)
- C++ å ³é®è¯
ä½ç½®ï¼é¦é¡µ > C++ åèæå >C++ è¯è¨ > ç®æ¯è¿ç®ç¬¦
ç®æ¯è¿ç®ç¬¦
è¿åç¹å®ç®æ¯è¿ç®çç»æã
| è¿ç®ç¬¦å | è¯æ³ | å¯éè½½ | åå示ä¾ï¼å¯¹äº class Tï¼ | |
|---|---|---|---|---|
| ç±»å å®ä¹ | ç±»å¤å®ä¹ | |||
| ä¸å å | +a
|
æ¯ | T T::operator+() const; | T operator+(const T &a); |
| ä¸å å | -a
|
æ¯ | T T::operator-() const; | T operator-(const T &a); |
| å æ³ | a + b
|
æ¯ | T T::operator+(const T2 &b) const; | T operator+(const T &a, const T2 &b); |
| åæ³ | a - b
|
æ¯ | T T::operator-(const T2 &b) const; | T operator-(const T &a, const T2 &b); |
| 乿³ | a * b
|
æ¯ | T T::operator*(const T2 &b) const; | T operator*(const T &a, const T2 &b); |
| 餿³ | a / b
|
æ¯ | T T::operator/(const T2 &b) const; | T operator/(const T &a, const T2 &b); |
| 模 | a % b
|
æ¯ | T T::operator%(const T2 &b) const; | T operator%(const T &a, const T2 &b); |
| éä½é | ~a
|
æ¯ | T T::operator~() const; | T operator~(const T &a); |
| éä½ä¸ | a & b
|
æ¯ | T T::operator&(const T2 &b) const; | T operator&(const T &a, const T2 &b); |
| é使 | a | b
|
æ¯ | T T::operator|(const T2 &b) const; | T operator|(const T &a, const T2 &b); |
| éä½å¼æ | a ^ b
|
æ¯ | T T::operator^(const T2 &b) const; | T operator^(const T &a, const T2 &b); |
| éä½å·¦ç§» | a << b
|
æ¯ | T T::operator<<(const T2 &b) const; | T operator<<(const T &a, const T2 &b); |
| éä½å³ç§» | a >> b
|
æ¯ | T T::operator>>(const T2 &b) const; | T operator>>(const T &a, const T2 &b); |
| ||||
è§£é
ææç®æ¯è¿ç®ç¬¦è®¡ç®ç¹å®ç®æ¯è¿ç®çç»æï¼å¹¶è¿åå ¶ç»æãä¸ä¿®æ¹å®åã
转æ¢
è¥ä¼ éç»ç®æ¯è¿ç®ç¬¦çæä½æ°æ¯æ´åææ ä½ç¨åæä¸¾ç±»åï¼åå¨ä»»ä½å ¶ä»è¡å¨åï¼ä½å¨å·¦å¼å°å³å¼è½¬æ¢åï¼è¥å ¶éç¨ï¼ï¼å¯¹æä½æ°å®æ½æ´åæåãè¥æä½æ°ä¹ä¸å ·ææ°ç»æå½æ°ç±»åï¼å宿½æ°ç»å°æéå彿°å°æé转æ¢ã
对äºï¼é¤ç§»ä½ä¹å¤çï¼äºå è¿ç®ç¬¦ï¼å½æååçæä½æ°æ¥æä¸åç±»åæ¶ï¼å®æ½ç§°ä¸ºä¸è¬ç®æ¯è½¬æ¢ (usual arithmetic conversion)çä¸ç»é¢å¤çéå¼è½¬æ¢ï¼ç®çæ¯äº§çå ¬å ±ç±»å (common type)ï¼äº¦å¯ç± std::common_type ç±»åç¹æ§è®¿é®ï¼ãè¥å¨ä»»ä½æ´åæååï¼ä¸ä¸ªæä½æ°ä¸ºæä¸¾ç±»åèå¦ä¸æä½æ°ä¸ºæµ®ç¹ç±»åæä¸åçæä¸¾ç±»åï¼åæ¤è¡ä¸ºè¢«å¼ç¨ã (C++20 èµ·)
- è¥ä»»ä¸æä½æ°å ·ææä½ç¨åæä¸¾ç±»åï¼åä¸è¿è¡è½¬æ¢ï¼å¦ä¸æä½æ°åè¿åç±»åå¿ é¡»å ·æç¸åç±»å
- å¦åï¼è¥ä»»ä¸æä½æ°ä¸º long doubleï¼åå°å¦ä¸æä½æ°è½¬æ¢ä¸º long double
- å¦åï¼è¥ä»»ä¸æä½æ°ä¸º doubleï¼åå°å¦ä¸æä½æ°è½¬æ¢ä¸º double
- å¦åï¼è¥ä»»ä¸æä½æ°ä¸º floatï¼åå°å¦ä¸æä½æ°è½¬æ¢ä¸º float
- å¦åï¼æä½æ°æ¥ææ´æ°ç±»åï¼å 为
boolãcharãchar8_tãchar16_tãchar32_tãwchar_tåæ ä½ç¨åæä¸¾å¨æ¤æ¶å·²è¢«æåï¼ï¼å¹¶å¯¹å ¶å®æ½æ´å转æ¢ä»¥äº§çå¦ä¸çå ¬å ±ç±»åï¼
- è¥ä¸¤ä¸ªæä½æ°å为æç¬¦å·æå为æ 符å·ï¼åå°æ¥æè¾å°è½¬æ¢ç级çæä½æ°è½¬æ¢ä¸ºæ¥æè¾å¤§æ´æ°è½¬æ¢ç级çæä½æ°çç±»åã
- å¦åï¼è¥æ ç¬¦å·æä½æ°ç转æ¢ççº§å¤§äºæçäºæç¬¦å·æä½æ°ç转æ¢ç级ï¼åå°æç¬¦å·æä½æ°è½¬æ¢ä¸ºæ ç¬¦å·æä½æ°çç±»åã
- å¦åï¼è¥æç¬¦å·æä½æ°çç±»åè½è¡¨ç¤ºæ ç¬¦å·æä½æ°ç±»åçææå¼ï¼åå°æ ç¬¦å·æä½æ°è½¬æ¢ä¸ºæç¬¦å·æä½æ°çç±»åã
- å¦åï¼å°ä¸¤ä¸ªæä½æ°é½è½¬æ¢ä¸ºæç¬¦å·æä½æ°çæ 符å·å¯¹åºçæ¬ã
转æ¢ç级ï¼conversion rankï¼æ boolãsigned charãshortãintãlongãlong long 顺åºéå¢ã任使 符å·ç±»åçç级é½çäºå ¶å¯¹åºçæç¬¦å·ç±»åçç级ãchar çç级çäº signed char å unsigned char çç级ãchar8_tãchar16_tãchar32_t å wchar_t çç级çäºå ¶åºå±ç±»åçç级ã
溢åº
æ ç¬¦å·æ´æ°ç®æ¯å§ç»è¿è¡ modulo 2n
ï¼å
¶ä¸ n æ¯è¯¥æ´æ°ç使°ãä¾å¦å¯¹äº unsigned intï¼å UINT_MAX å ä¸å¾å° â0âï¼èä» â0â åä¸å¾å° UINT_MAXã
æç¬¦å·æ´æ°ç®æ¯è¿ç®æº¢åºï¼ç»æç±»åæ æ³å®¹çº³å
¶ç»æï¼æ¶ï¼è¡ä¸ºæªå®ä¹ï¼å®å¯è½æç
§è¡¨ç¤ºæ³çè§åï¼å
¸å为补ç ï¼åçåç»ï¼å¯è½å¨æäºå¹³å°ä¸æç±äºç¼è¯å¨é项ï¼ä¾å¦ GCC å Clang ä¸ç -ftrapvï¼å¼åé·é±ï¼ä¹å¯è½å®å
¨è¢«ç¼è¯å¨ä¼åæã
æµ®ç¹ç¯å¢
è¥æ¯æ
#pragma STDC FENV_ACCESS 并设置å®ä¸º ONï¼åæææµ®ç¹ç®æ¯è¿ç®ç¬¦é½æä»å½åæµ®ç¹èå
¥æ¹åï¼å¹¶æ¥å math_errhandling 䏿å®çæµ®ç¹ç®æ¯é误ï¼é¤éæ¯åçäºéæåå§åå¨ä¹ä¸ï¼è¯¥æ
åµä¸ä¸å¼åæµ®ç¹å¼å¸¸ï¼èèå
¥æ¨¡å¼ä¸ºæè¿èå
¥ï¼ã
æµ®ç¹ç¼©ç¥
é¤éæ¯æ
#pragma STDC FP_CONTRACT 并设置å®ä¸º OFFï¼å¦åæææµ®ç¹ç®æ¯é½å¯ä»¥å¦åå
¶ä¸é´ç»ææ¥ææ éèå´å精度ä¸è¬è¿è¡ï¼å³å
è®¸å®æ½çç¥èå
¥è¯¯å·®åæµ®ç¹å¼å¸¸çä¼åãä¾å¦ C++ å
è®¸ä»¥åæ¡èåä¹å CPU æä»¤æ¥å®ç° (x*y) + zï¼ææ a = x*x*x*x; ä¼å为 tmp = x *x; a = tmp*tmpã
æ å ³ä¹ç¼©ç¥ï¼æµ®ç¹ç®æ¯çä¸é´ç»æå¯æ¥æä¸å ¶ç±»åææå®ä¸åçèå´å精度ï¼è§ FLT_EVAL_METHODã
æ£å¼èè¨ï¼C++ æ åä¸å¨æµ®ç¹è¿ç®ç精度ä¸åä»»ä½ä¿è¯ã
ä¸å ç®æ¯è¿ç®ç¬¦
ä¸å ç®æ¯è¿ç®ç¬¦è¡¨è¾¾å¼çå½¢å¼ä¸º
+ 表达å¼
|
(1) | ||||||||
- 表达å¼
|
(2) | ||||||||
å 建çä¸å å è¿ç®ç¬¦è¿åå ¶æä½æ°çå¼ãä» æçéæ æä½æ å½¢ï¼æ¯å½æä½æ°æ¥ææ´åç±»åææ ä½ç¨åæä¸¾ç±»åæ¶ï¼å®å°è¢«æ´åæåææ´æ¹ï¼ä¾å¦å° char 转æ¢ä¸º intï¼æè 彿使°æä»å·¦å¼å°å³å¼ãæ°ç»å°æéæå½æ°å°æéè½¬æ¢æ¶ã
å
建çä¸å
åè¿ç®ç¬¦è®¡ç®å
¶æååæä½æ°çç¸åæ°ãå¯¹äºæ 符å·ç aï¼-a çå¼ä¸º 2b
-aï¼å
¶ä¸ b 为æååç使°ã
å¨éå¯¹ç¨æ·å®ä¹è¿ç®ç¬¦çéè½½å³è®®ä¸ï¼å¯¹äºæ¯ä¸ªæååç®æ¯ç±»å A åæ¯ä¸ªç±»å Tï¼ä¸å彿°ç¾ååä¸éè½½å³è®®ï¼
| A operator+(A) |
||
| T* operator+(T*) |
||
| A operator-(A) |
||
#include <iostream> int main() { char c = 0x6a; int n1 = 1; unsigned char n2 = 1; unsigned int n3 = 1; std::cout << "char: " << c << " int: " << +c << '\n' << "-1, where 1 is signed: " << -n1 << '\n' << "-1, where 1 is unsigned char: " << -n2 << '\n' << "-1, where 1 is unsigned int: " << -n3 << '\n'; char a[3]; std::cout << "size of array: " << sizeof a << '\n' << "size of pointer: " << sizeof +a << '\n'; }
è¾åºï¼
char: j int: 106 -1, where 1 is signed: -1 -1, where 1 is unsigned char: -1 -1, where 1 is unsigned int: 4294967295 size of array: 3 size of pointer: 8
å æ§è¿ç®ç¬¦
äºå å æ§ç®æ¯è¿ç®ç¬¦è¡¨è¾¾å¼çå½¢å¼ä¸º
lhs + rhs
|
(1) | ||||||||
lhs - rhs
|
(2) | ||||||||
- 齿¥æç®æ¯ææ ä½ç¨åæä¸¾ç±»åãæ¤æ åµä¸ï¼å¯¹ä¸¤ä¸ªæä½æ°é½å®æ½ä¸è¬ç®æ¯è½¬æ¢ï¼å¹¶ç¡®å®ç»æç±»åã
- ä¸ä¸ªæ¯æå宿´å®ä¹ç对象çæéç±»åï¼å¦ä¸ä¸ªæ¥ææ´åææ ä½ç¨åæä¸¾ç±»åãæ¤æ åµä¸ï¼ç»æå ·ææéçç±»åã
- 齿¥æç®æ¯ææ ä½ç¨åæä¸¾ç±»åãæ¤æ åµä¸ï¼å¯¹ä¸¤ä¸ªæä½æ°é½å®æ½ä¸è¬ç®æ¯è½¬æ¢ï¼å¹¶ç¡®å®ç»æç±»åã
- lhs 为æå宿´å®ä¹ç对象类åçæéï¼rhs æ¥ææ´åææ ä½ç¨åæä¸¾ç±»åãæ¤æ åµä¸ï¼ç»æå ·ææéçç±»åã
- å¿½ç¥ cv éå®ç¬¦æ¶ï¼ä¸¤è 齿¯æåç¸å宿´å®ä¹ç对象类åçæéãæ¤æ åµä¸ï¼ç»æç±»å为 std::ptrdiff_tã
对äºç®æ¯ææä¸¾ç±»åçæä½æ°ï¼äºå å çç»ææ¯æä½æ°ï¼ç»ä¸è¬ç®æ¯è½¬æ¢åï¼çåï¼èäºå åè¿ç®ç¬¦çç»ææ¯ç¬¬ä¸æä½æ°åå»ç¬¬äºæä½æ°ï¼ç»ä¸è¬ç®æ¯è½¬æ¢åï¼çç»æï¼ä½æ¯ï¼å¦æè¯¥ç±»åæ¯æ IEEE æµ®ç¹ç®æ¯ï¼è§ std::numeric_limits::is_iec559ï¼ï¼
- è¥æä½æ°ä¹ä¸ä¸º NaNï¼åç»æä¸º NaN
- æ ç©·åæ ç©·ä¸º NaNï¼å¹¶å¼å FE_INVALID
- æ ç©·å è´æ 穷为 NaNï¼å¹¶å¼å FE_INVALID
è¥ä»»ä½æä½æ°ä¸ºæéï¼åéç¨ä¸åè§åï¼
- ææåéæ°ç»å¯¹è±¡çæéå½åæå大å°ä¸º 1 çæ°ç»çé¦å ç´ çæéã
- è¥æé
Pæåæ°ç»ç第i个å ç´ ï¼å表达å¼P+nãn+PåP-nå嫿¯æåå䏿°ç»ç第i+nã第i+nå第i-n个å ç´ çåç±»åæéãæéå æ³çç»æäº¦å¯ä¸ºæ«å°¾åä¸ä½ç½®ï¼one past the endï¼çæéï¼å³ä½¿å¾P-1æåæ°ç»æ«å ç´ çæéPï¼ãä»»ä½å ¶ä»æ å½¢ï¼å³è¯å¾çæä¸æåå䏿°ç»çä»»ä½å ç´ æå䏿°ç»æ«å°¾åä¸ä½ç½®çæéï¼åå¼èµ·æªå®ä¹è¡ä¸ºã - è¥æé
Pæåæ°ç»ç第i个å ç´ ï¼èæéQæåå䏿°ç»ç第j个å ç´ ï¼å表达å¼P-Qæ¥æå¼ i-jï¼è¥ std::ptrdiff_t å¯å®¹çº³è¯¥å¼ï¼ã两个æä½æ°é½å¿ é¡»æåå䏿°ç»çå ç´ ï¼ææ«å°¾åä¸ä½ç½®ï¼ï¼å¦åè¡ä¸ºæªå®ä¹ãè¥ç»æä¸è½ç± std::ptrdiff_t 容纳ï¼åè¡ä¸ºæªå®ä¹ã - 任使 åµä¸ï¼å¦æææåçç±»å䏿°ç»å ç´ ç±»åä¸åï¼å ¶ä¸å¯¹äºæ¯ä¸å±å ç´ ï¼è¥å®ä»¬èªèº«å³ä¸ºæéï¼åä¸èèå ¶ cv é宿§ï¼ï¼åæéç®æ¯çè¡ä¸ºæªå®ä¹ãç¹å«æ¯ï¼ä»¥æåæä¸ªæ´¾ç对象æ°ç»ä¸çå ç´ çæååºç±»æéåæéç®æ¯æ¯æªå®ä¹çã
- 对æéå æå â0âï¼ç»æå°±æ¯è¯¥æéï¼æ²¡ææ´æ¹ãè¥ä¸¤ä¸ªæéæååä¸å¯¹è±¡ï¼æé½æåå䏿°ç»çæ«å°¾åä¸ä½ç½®ï¼æé½æ¯ç©ºæéï¼ååæ³çç»æçäº (std::ptrdiff_t)0ã
è¿äºæéç®æ¯è¿ç®ç¬¦ï¼å 许æéå¾ä»¥æ»¡è¶³éçéæºè®¿é®è¿ä»£å¨ (LegacyRandomAccessIterator) çè¦æ±ã
å¨éå¯¹ç¨æ·å®ä¹è¿ç®ç¬¦çéè½½å³è®®ä¸ï¼å¯¹äºæ¯å¯¹æååçç®æ¯ç±»å L å R åæ¯ä¸ªå¯¹è±¡ç±»å Tï¼ä¸å彿°ç¾ååä¸éè½½å³è®®ï¼
| LR operator+(L, R) |
||
| LR operator-(L, R) |
||
| T* operator+(T*, std::ptrdiff_t) |
||
| T* operator+(std::ptrdiff_t, T*) |
||
| T* operator-(T*, std::ptrdiff_t) |
||
| std::ptrdiff_t operator-(T*, T*) |
||
å
¶ä¸ LR æ¯å¯¹ L å R 宿½ä¸è¬ç®æ¯è½¬æ¢çç»æã
#include <iostream> int main() { char c = 2; unsigned int un = 2; int n = -10; std::cout << " 2 + (-10), where 2 is a char = " << c + n << '\n' << " 2 + (-10), where 2 is unsigned = " << un + n << '\n' << " -10 - 2.12 = " << n - 2.12 << '\n'; Â char a[4] = {'a', 'b', 'c', 'd'}; char* p = &a[1]; std::cout << "Pointer addition examples: " << *p << *(p + 2) << *(2 + p) << *(p - 1) << '\n'; char* p2 = &a[4]; std::cout << "Pointer difference: " << p2 - p << '\n'; }
è¾åºï¼
2 + (-10), where 2 is a char = -8 2 + (-10), where 2 is unsigned = 4294967288 -10 - 2.12 = -12.12 Pointer addition examples: bdda Pointer difference: 3
乿§è¿ç®ç¬¦
äºå 乿§è¿ç®ç¬¦è¡¨è¾¾å¼çå½¢å¼ä¸º
lhs * rhs
|
(1) | ||||||||
lhs / rhs
|
(2) | ||||||||
lhs % rhs
|
(3) | ||||||||
ææä¸ä¸ªè¿ç®ç¬¦ï¼å对两个æä½æ°å®æ½ä¸è¬ç®æ¯è½¬æ¢ï¼å¹¶ç¡®å®ç»æç±»åã
äºå è¿ç®ç¬¦ * è¿è¡å ¶æä½æ°ï¼ç»ä¸è¬ç®æ¯è½¬æ¢åï¼ç乿³ï¼ä½å¯¹äºæµ®ç¹ä¹æ³ï¼
- NaN ä¹ä»¥ä»»ä½æ°åå¾ NaN
- æ ç©·ä¹ä»¥é¶å¾ NaN å¹¶å¼å FE_INVALID
äºå è¿ç®ç¬¦ / å°ç¬¬ä¸æä½æ°é¤ä»¥ç¬¬äºæä½æ°ï¼ç»ä¸è¬ç®æ¯è½¬æ¢åï¼ã
å¯¹äºæ´åæä½æ°ï¼å®äº§ç代æ°åï¼
|
以å®ç°å®ä¹çæ¹å对åè¿è¡èå ¥ã |
(C++11 å) |
|
ååé¶åæ´ï¼èå¼å°æ°é¨åï¼ã |
(C++11 èµ·) |
è¥ç¬¬äºæä½æ°ä¸ºé¶ï¼åè¡ä¸ºæªå®ä¹ï¼ä½è¥è¿è¡æµ®ç¹é¤æ³ä¸ç±»åæ¯æ IEEE æµ®ç¹ç®æ¯ï¼è§ std::numeric_limits::is_iec559ï¼ï¼åï¼
- è¥æä½æ°ä¹ä¸ä¸º NaNï¼åç»æä¸º NaN
- éé¶æ°é¤ä»¥ ±0.0 å¾å°ç¬¦å·æ£ç¡®çæ ç©·ï¼å¹¶å¼å FE_DIVBYZERO
- 0.0 é¤ä»¥ 0.0 å¾ NaNï¼å¹¶å¼å FE_INVALID
äºå
è¿ç®ç¬¦Â % 产çä»¥ç¬¬äºæä½æ°æ´é¤ç¬¬ä¸æä½æ°ç使°ï¼ç»ä¸è¬ç®æ¯è½¬æ¢åï¼æ³¨æåæä½æ°çç±»åå¿
é¡»é½ä¸ºæ´åç±»åï¼ãè¥å a/b è½ä»¥ç»æç±»å表示ï¼å (a/b)*b + a%b == aãè¥ç¬¬äºæä½æ°ä¸ºé¶ï¼åè¡ä¸ºæªå®ä¹ãè¥å a/b ä¸è½ä»¥ç»æç±»å表示ï¼å a/b å a%b çè¡ä¸ºåæªå®ä¹ï¼è¿æå³çï¼è¡¥ç ç³»ç»ä¸ INT_MIN%-1 为æªå®ä¹ï¼ã
注æï¼C++11 ä¹åï¼è¥äºå è¿ç®ç¬¦Â % çä¸æä¸¤ä¸ªæä½æ°ä¸ºè´ï¼å使°ç¬¦å·æ¯å®ç°å®ä¹çï¼å 为å®åå³äºæ´æ°é¤æ³çèå ¥æ¹åã彿° std::div å¨è¯¥æ åµä¸æä¾è¯å¥½å®ä¹çè¡ä¸ºã
注æï¼å¯¹äºæµ®ç¹ä½æ°ï¼è§ std::remainder å std::fmodã
å¨éå¯¹ç¨æ·å®ä¹è¿ç®ç¬¦çéè½½å³è®®ä¸ï¼å¯¹äºæ¯å¯¹æååçç®æ¯ç±»å LA ä¸ RA 忝坹æååçæ´åç±»å LI ä¸ RIï¼ä¸å彿°ç¾ååä¸éè½½å³è®®ï¼
| LRA operator*(LA, RA) |
||
| LRA operator/(LA, RA) |
||
| LRI operator%(LI, RI) |
||
å
¶ä¸ LRx æ¯å¯¹ Lx å Rx 宿½ä¸è¬ç®æ¯è½¬æ¢çç»æã
#include <iostream> int main() { char c = 2; unsigned int un = 2; int n = -10; std::cout << "2 * (-10), where 2 is a char = " << c * n << '\n' << "2 * (-10), where 2 is unsigned = " << un * n << '\n' << "-10 / 2.12 = " << n / 2.12 << '\n' << "-10 / 21 = " << n / 21 << '\n' << "-10Â % 21 = " << n % 21 << '\n'; }
è¾åºï¼
2 * (-10), where 2 is a char = -20 2 * (-10), where 2 is unsigned = 4294967276 -10 / 2.12 = -4.71698 -10 / 21 = 0 -10Â % 21 = -10
éä½é»è¾è¿ç®ç¬¦
éä½ç®æ¯è¿ç®ç¬¦è¡¨è¾¾å¼çå½¢å¼ä¸º
~ rhs
|
(1) | ||||||||
lhs & rhs
|
(2) | ||||||||
lhs | rhs
|
(3) | ||||||||
lhs ^ rhs
|
(4) | ||||||||
operator~ çç»ææ¯å®åå¼ï¼æååï¼çéä½éï¼åç ï¼ä¸çè¡¥ç ï¼ãoperator& çç»ææ¯ä¸¤ä¸ªæä½æ°å¼ï¼ç»ä¸è¬ç®æ¯è½¬æ¢åï¼çéä½ä¸ãoperator| çç»ææ¯ä¸¤ä¸ªæä½æ°å¼ï¼ç»ä¸è¬ç®æ¯è½¬æ¢åï¼çé使ãoperator^ çç»ææ¯ä¸¤ä¸ªæä½æ°å¼ï¼ç»ä¸è¬ç®æ¯è½¬æ¢åï¼çéä½å¼æã
å¨éå¯¹ç¨æ·å®ä¹è¿ç®ç¬¦çéè½½å³è®®ä¸ï¼å¯¹äºæ¯å¯¹æååçæ´åç±»å L å Rï¼ä¸å彿°ç¾ååä¸éè½½å³è®®ï¼
| R operator~(R) |
||
| LR operator&(L, R) |
||
| LR operator^(L, R) |
||
| LR operator|(L, R) |
||
å
¶ä¸ LR æ¯å¯¹ L å R 宿½ä¸è¬ç®æ¯è½¬æ¢çç»æã
#include <iostream> int main() { std::cout << std::hex << std::showbase; uint16_t mask = 0x00f0; uint32_t a = 0x12345678; std::cout << "Value: " << a << " mask: " << mask << '\n' << "Setting bits: " << (a | mask) << '\n' << "Clearing bits: " << (a & ~mask) << '\n' << "Selecting bits: " << (a & mask) << '\n'; }
è¾åºï¼
Value: 0x12345678 mask: 0xf0 Setting bits: 0x123456f8 Clearing bits: 0x12345608 Selecting bits: 0x70
ç§»ä½è¿ç®ç¬¦
ç§»ä½è¿ç®ç¬¦è¡¨è¾¾å¼çå½¢å¼ä¸º
lhs << rhs
|
(1) | ||||||||
lhs >> rhs
|
(2) | ||||||||
è¿åç±»åæ¯æååçå·¦æä½æ°çç±»åã
|
å¯¹äºæ 符å·
对äºè´ å¯¹äºæ ç¬¦å· å¯¹äºè´ |
(C++20 å) | ||||
|
|
(C++20 èµ·) |
任使 åµä¸ï¼è¥å³æä½æ°çå¼ä¸ºè´æå¤§äºçäºæååå·¦æä½æ°ä¸ç使°ï¼åè¡ä¸ºæªå®ä¹ã
å¨éå¯¹ç¨æ·å®ä¹è¿ç®ç¬¦çéè½½å³è®®ä¸ï¼å¯¹äºæ¯å¯¹æååçæ´åç±»å L å Rï¼ä¸å彿°ç¾ååä¸éè½½å³è®®ï¼
| L operator<<(L, R) |
||
| L operator>>(L, R) |
||
#include <iostream> enum {ONE=1, TWO=2}; int main() { std::cout << std::hex << std::showbase; char c = 0x10; unsigned long long ull = 0x123; std::cout << "0x123 << 1 = " << (ull << 1) << '\n' << "0x123 << 63 = " << (ull << 63) << '\n' // æ 符å·ä¸çæº¢åº << "0x10 << 10 = " << (c << 10) << '\n'; // æå char å° int long long ll = -1000; std::cout << std::dec << "-1000 >> 1 = " << (ll >> ONE) << '\n'; }
è¾åºï¼
0x123 << 1 = 0x246 0x123 << 63 = 0x8000000000000000 0x10 << 10 = 0x4000 -1000 >> 1 = -500
æ ååº
è®¸å¤æ ååºç±»åé½éè½½äºç®æ¯è¿ç®ç¬¦ã
ä¸å ç®æ¯è¿ç®ç¬¦
| å®ç°ä¸å
+ åä¸å
- ( std::chrono::duration<Rep,Period> çå
¬å¼æå彿°) | |
| 坹夿°è¿ç¨ä¸å
è¿ç®ç¬¦ (彿°æ¨¡æ¿) | |
| 对 valarray çæ¯ä¸ªå
ç´ è¿ç¨ä¸å
ç®æ¯è¿ç®ç¬¦ ( std::valarray<T> çå
¬å¼æå彿°) |
å æ§è¿ç®ç¬¦
| 宿½æ¶åæ¶é´ç¹çå æ³ååæ³è¿ç® (彿°æ¨¡æ¿) | |
| å®ç°ä»¥æ¶é¿ä¸ºå®åçç®æ¯è¿ç® (彿°æ¨¡æ¿) | |
å° year_month_day ä¸ä¸å®éçå¹´æ°æææ°ç¸å æç¸å ( std::chrono::year_month_day çå
¬å¼æå彿°) | |
| è¿æ¥ä¸¤ä¸ªå符串æè
ä¸ä¸ªå符串åä¸ä¸ªå符 (彿°æ¨¡æ¿) | |
| æ¨è¿æåå°è¿ä»£å¨ ( std::reverse_iterator<Iter> çå
¬å¼æå彿°)
| |
| æ¨è¿æåå°è¿ä»£å¨ ( std::move_iterator<Iter> çå
¬å¼æå彿°)
| |
| å¨ä¸¤ä¸ªå¤æ°ï¼æä¸ä¸ªå¤æ°ä¸ä¸ä¸ªæ éä¸è¿è¡å¤æ°ç®æ¯è¿ç® (彿°æ¨¡æ¿) | |
| 对两个 valarray çæ¯ä¸ªå
ç´ ï¼æä¸ä¸ª valarray çæ¯ä¸ªå
ç´ åä¸ä¸ªå¼è¿ç¨äºå
è¿ç®ç¬¦ (彿°æ¨¡æ¿) |
乿§è¿ç®ç¬¦
| å®ç°ä»¥æ¶é¿ä¸ºå®åçç®æ¯è¿ç® (彿°æ¨¡æ¿) | |
| å¨ä¸¤ä¸ªå¤æ°ï¼æä¸ä¸ªå¤æ°ä¸ä¸ä¸ªæ éä¸è¿è¡å¤æ°ç®æ¯è¿ç® (彿°æ¨¡æ¿) | |
| 对两个 valarray çæ¯ä¸ªå
ç´ ï¼æä¸ä¸ª valarray çæ¯ä¸ªå
ç´ åä¸ä¸ªå¼è¿ç¨äºå
è¿ç®ç¬¦ (彿°æ¨¡æ¿) |
éä½é»è¾è¿ç®ç¬¦
| è¿è¡äºè¿å¶ä¸ãæã弿åé ( std::bitset<N> çå
¬å¼æå彿°) | |
| å¨ bitset 䏿§è¡äºå
é»è¾æä½ (彿°) | |
| 对 valarray çæ¯ä¸ªå
ç´ è¿ç¨ä¸å
ç®æ¯è¿ç®ç¬¦ ( std::valarray<T> çå
¬å¼æå彿°)
| |
| 对两个 valarray çæ¯ä¸ªå
ç´ ï¼æä¸ä¸ª valarray çæ¯ä¸ªå
ç´ åä¸ä¸ªå¼è¿ç¨äºå
è¿ç®ç¬¦ (彿°æ¨¡æ¿) |
ç§»ä½è¿ç®ç¬¦
| 对两个 valarray çæ¯ä¸ªå
ç´ ï¼æä¸ä¸ª valarray çæ¯ä¸ªå
ç´ åä¸ä¸ªå¼è¿ç¨äºå
è¿ç®ç¬¦ (彿°æ¨¡æ¿) | |
| è¿è¡äºè¿å¶å·¦ç§»åå³ç§» ( std::bitset<N> çå
¬å¼æå彿°)
|
æµæå ¥/æ½åè¿ç®ç¬¦
æ´ä¸ªæ ååºä¸ï¼ç§»ä½è¿ç®ç¬¦å¸¸å¯¹ I/O æµï¼ std::ios_base& æä»å®æ´¾ççç±»ä¹ä¸ï¼éè½½ï¼ä»¥ä¹ä¸ºå·¦è¿ç®æ°åè¿åç±»åãè¿ç§è¿ç®ç¬¦è¢«ç§°ä¸ºæµæå ¥åæµæ½åè¿ç®ç¬¦ï¼
| æåå¸¦æ ¼å¼æ°æ® ( std::basic_istream<CharT,Traits> çå
¬å¼æå彿°) | |
| æåå符åå符æ°ç» (彿°æ¨¡æ¿) | |
| æå
¥å¸¦æ ¼å¼æ°æ® ( std::basic_ostream<CharT,Traits> çå
¬å¼æå彿°) | |
| æå
¥åç¬¦æ°æ® (彿°) | |
| 夿°çåºåååååºåå (彿°æ¨¡æ¿) | |
| æ§è¡ bitset çæµè¾å
¥åè¾åº (彿°) | |
| æ§è¡åç¬¦ä¸²çæµè¾å
¥ä¸è¾åº (彿°æ¨¡æ¿) | |
| æ§è¡ä¼ªéæºæ°å¼æçæµè¾å
¥åè¾åº (彿°) | |
| æ§è¡ä¼ªéæºæ°åå¸çæµè¾å
¥åè¾åº (彿°æ¨¡æ¿) |
åé
| 常è§è¿ç®ç¬¦ | ||||||
|---|---|---|---|---|---|---|
| èµå¼ | èªå¢ èªå |
ç®æ¯ | é»è¾ | æ¯è¾ | æåè®¿é® | å ¶ä» |
|
a = b |
++a |
+a |
!a |
a == b |
a[b] |
a(...) |
| ç¹æ®è¿ç®ç¬¦ | ||||||
|
static_cast 转æ¢ä¸ä¸ªç±»å为å¦ä¸ç¸å
³ç±»å | ||||||