1.C++里面的if語句要有小括號括起來,比如:
if (a>b){cout<<a;}
2.Lambda 函數(shù)與表達式
C++11 提供了對匿名函數(shù)的支持,稱為 Lambda 函數(shù)(也叫 Lambda 表達式)。?
Lambda函數(shù)的語法定義如下:
[capture](parameters) mutable ->return-type{statement}
其中:
[capture]:捕捉列表。捕捉列表總是出現(xiàn)在 lambda 表達式的開始處。事實上,[] 是 lambda 引出符。編譯器根據(jù)該引出符判斷接下來的代碼是否是 lambda 函數(shù)。捕捉列表能夠捕捉上下文中的變量供 lambda 函數(shù)使用。
(parameters):參數(shù)列表。與普通函數(shù)的參數(shù)列表一致。如果不需要參數(shù)傳遞,則可以連同括號 () 一起省略。
mutable:mutable 修飾符。默認(rèn)情況下,lambda 函數(shù)總是一個 const 函數(shù),mutable 可以取消其常量性。在使用該修飾符時,參數(shù)列表不可省略(即使參數(shù)為空)。
->return_type:返回類型。用追蹤返回類型形式聲明函數(shù)的返回類型。出于方便,不需要返回值的時候也可以連同符號 -> 一起省略。此外,在返回類型明確的情況下,也可以省略該部分,讓編譯器對返回類型進行推導(dǎo)。
{statement}:函數(shù)體。內(nèi)容與普通函數(shù)一樣,不過除了可以使用參數(shù)之外,還可以使用所有捕獲的變量。
例如:
[](int x, int y){ return x < y ; }
如果沒有返回值可以表示為:
[capture](parameters){body}
例如:
[]{ ++global_x; }
在一個更為復(fù)雜的例子中,返回類型可以被明確的指定如下:
[](int x, int y) -> int { int z = x + y; return z + x; }
本例中,一個臨時的參數(shù) z 被創(chuàng)建用來存儲中間結(jié)果。如同一般的函數(shù),z 的值不會保留到下一次該不具名函數(shù)再次被調(diào)用時。
如果 lambda 函數(shù)沒有傳回值(例如 void),其返回類型可被完全忽略。
在Lambda表達式內(nèi)可以訪問當(dāng)前作用域的變量,這是Lambda表達式的閉包(Closure)行為。 與JavaScript閉包不同,C++變量傳遞有傳值和傳引用的區(qū)別??梢酝ㄟ^前面的[]來指定:
[]? ? ? // 沒有定義任何變量。使用未定義變量會引發(fā)錯誤。
[x, &y] // x以傳值方式傳入(默認(rèn)),y以引用方式傳入。
[&]? ? // 任何被使用到的外部變量都隱式地以引用方式加以引用。
[=]? ? // 任何被使用到的外部變量都隱式地以傳值方式加以引用。
[&, x]? // x顯式地以傳值方式加以引用。其余變量以引用方式加以引用。
[=, &z] // z顯式地以引用方式加以引用。其余變量以傳值方式加以引用。
另外有一點需要注意。對于[=]或[&]的形式,lambda 表達式可以直接使用 this 指針。但是,對于[]的形式,如果要使用 this 指針,必須顯式傳入:
[this]() { this->someFunc(); }();?
舉一個實際的例子:
int x=10;
auto add_x = [x](int a) mutable { x *= 2; return a + x; };? // 復(fù)制捕捉x
cout << add_x(10) << endl; // 輸出 30
但是!?。∥业倪@個一直沒有運行成功,提示add_x沒有定義,我明明定義了呀??
3.C++ 數(shù)學(xué)運算
在 C++ 中,除了可以創(chuàng)建各種函數(shù),還包含了各種有用的函數(shù)供您使用。這些函數(shù)寫在標(biāo)準(zhǔn) C 和 C++ 庫中,叫做內(nèi)置函數(shù)。您可以在程序中引用這些函數(shù)。
C++ 內(nèi)置了豐富的數(shù)學(xué)函數(shù),可對各種數(shù)字進行運算。下表列出了 C++ 中一些有用的內(nèi)置的數(shù)學(xué)函數(shù)。
為了利用這些函數(shù),您需要引用數(shù)學(xué)頭文件<cmath>。
序號函數(shù) & 描述
1double cos(double);
該函數(shù)返回弧度角(double 型)的余弦。
2double sin(double);
該函數(shù)返回弧度角(double 型)的正弦。
3double tan(double);
該函數(shù)返回弧度角(double 型)的正切。
4double log(double);
該函數(shù)返回參數(shù)的自然對數(shù)。
5double pow(double, double);
假設(shè)第一個參數(shù)為 x,第二個參數(shù)為 y,則該函數(shù)返回 x 的 y 次方。
6double hypot(double, double);
該函數(shù)返回兩個參數(shù)的平方總和的平方根,也就是說,參數(shù)為一個直角三角形的兩個直角邊,函數(shù)會返回斜邊的長度。
7double sqrt(double);
該函數(shù)返回參數(shù)的平方根。
8int abs(int);
該函數(shù)返回整數(shù)的絕對值。
9double fabs(double);
該函數(shù)返回任意一個十進制數(shù)的絕對值。
10double floor(double);
該函數(shù)返回一個小于或等于傳入?yún)?shù)的最大整數(shù)。
4.C++ 隨機數(shù)
在許多情況下,需要生成隨機數(shù)。關(guān)于隨機數(shù)生成器,有兩個相關(guān)的函數(shù)。一個是rand(),該函數(shù)只返回一個偽隨機數(shù)。生成隨機數(shù)之前必須先調(diào)用srand()函數(shù)。srand函數(shù)是隨機數(shù)發(fā)生器的初始化函數(shù)。原型:void srand(unsigned seed),通常使用srand((unsigned)time(NULL))。
#include <ctime>//因為用了time()函數(shù)
#include <cstdlib>
// 設(shè)置種子
?srand( (unsigned)time( NULL ) );
? /* 生成 10 個隨機數(shù) */?
?for( i = 0; i < 10; i++ )? {? ? ? // 生成實際的隨機數(shù) ? ? ?
????????j= rand();
? ? ? ? cout <<"隨機數(shù): " << j << endl;
? }
注意:1、rand 隨機數(shù)產(chǎn)生的范圍:在標(biāo)準(zhǔn)的 C 庫中函數(shù) rand() 可以生成 0~RAND_MAX 之間的一個隨機數(shù),其中 RAND_MAX 是 stdlib.h 中定義的一個整數(shù),它與系統(tǒng)有關(guān),至少為 32767。
number[i] = rand() % 100; /*產(chǎn)生100以內(nèi)的隨機整數(shù)*/
2、使用 rand() 和 srand() 產(chǎn)生指定范圍內(nèi)的隨機整數(shù)的方法:“模除+加法”的方法。如要產(chǎn)生 [m,n] 范圍內(nèi)的隨機數(shù) num,可用:int num=rand()%(n-m+1)+m;(即rand()%[區(qū)間內(nèi)數(shù)的個數(shù)]+[區(qū)間起點值])