繼續進行c++的學習:
運算子:
運算子可以用來對常量和變數進行操作,下面是所有的運算子(教程上說是所有的,我持有懷疑態度):
**
x = 5;
此語句將整數5值賦給變數x。賦值操作總是從右到左進行,而不是相反:
x = y;
將y賦值給x。
例如:
// assignment operator#include using namespace std;
int main ()
結果是:
a:4 b:7
這個程式顯示在螢幕上的結果是a,b的最終結果(4和7).請注意即使我們中間宣告了a = b,但是這並不影響之後對b的賦值。
這表明賦值後的表示式本身是具有值的,賦值本身也是可以操作的,也是可以操作的,例如:
y=2+(x=5);
在這個表示式中y的值將是另乙個表示式的值(5)叫上2的結果。它大致相當於
x = 5;
y = 2 + x;
將最終將7分配給y;
一下表示式也是有效的:
x = y = z = 5;
它將三個變數x,y和z的值都分配成5,總是從左到右進行。
**
運算子 描述
+ 加法
- 減法
* 乘法
/ 除法
% 模
加法,減法,乘法和除法的運算按字面對應於它們各自的數**算符。最後乙個模數運算子,由百分號(%)表示,給出兩個值除法的餘數。例如:
x = 11 % 3;
導致變數x值成為2,因為將11除以3得到3,餘數為2。**
**復合賦值運算子通過對變數執行操作來修改變數的當前值。它們相當於將操作的結果賦給第乙個運算元:
表達 相當於
y += x; y=y+x
x -=5 x = x-5
x /=y x =x/y
price *= units + 1 price = price*(units + 1)
例子:
// compound assignment operators#include using namespace std;
int main ()
輸出結果是:5**
**遞增運算子(++)和遞減運算子(–)將儲存在變數中的值加1或者減1。
注意其中:
b=++a;表示先將a加一再進行賦值運算
b=a++;表示先進行賦值運算再將a加一
**
關係運算子的結果用bool型別的值來表示,即false和true
這裡有一些例子:
(7 == 5) // evaluates to false
(5 > 4) // evaluates to true
(3 != 2) // evaluates to true
(6 >= 6) // evaluates to true
(5 < 5) // evaluates to false
當然,不僅可以比較數字常數,而且只是任何值,當然還包括變數。假設a=2,b=3和c=6,則
(a == 5) // evaluates to false, since a is not equal to 5
(a*b >= c) // evaluates to true, since (2*3 >= 6) is true
(b+4 > a*c) // evaluates to false, since (3+4 > 2*6) is false
((b=2) == a) // evaluates to true
注意,最後乙個表示式中,先將2賦值給b,再和a比較,得到true**
**邏輯運算子是針對bool型別的運算子,例如:
!(5 == 5) // evaluates to false because the expression at its right (5 == 5) is true
!(6 <= 4) // evaluates to true because (6 <= 4) would be false
!true // evaluates to false
!false // evaluates to true
邏輯運算子&&和||的結果:
&&和運算子
a b a&&b
true true true
true false false
false true false
false false false
||或運算子
a b a||b
true true true
true false true
false true true
false false false
例如:
( (5 == 5) && (3 > 6) ) // evaluates to false ( true && false )
( (5 == 5) || (3 > 6) ) // evaluates to true ( true || false )
當使用邏輯運算子時,c ++僅評估從左到右所需的內容以得出組合的關係結果,忽略其餘的結果。因此,在最後乙個例子中((55)||(3>6)),c ++評估第一是否55是true,如果是這樣,它永遠不會檢查是否3>6是true或不是。這稱為短路評估,對於這些運算子來說是這樣的:
&& 如果左側的表示式是false,則組合結果是false
|| 如果左側的表示式是true,則組合結果是true
當右側的值更改時會有***,例如
if ( (i<10) && (++i…/ } // note that the condition increments i
**
condition ? result1 : result2
如果condition是true,則整個表示式的計算結果為result1,否則為result2。**
**逗號運算子(,)用於分隔兩個或多個表示式,這些表示式只包含乙個表示式。當必須針對值計算表示式集時,僅考慮最右側的表示式。
例如,以下**:
a = (b=3, b+2);
首先將值3分配給b,然後分配b+2給變數a。因此,最後,變數a值為5,而變數b值為3。
****
位運算子考慮表示它們儲存的值的位模式來修改變數。
運算子 等價 描述
& and 按位與
| or 按位或
^ xor 按位異或
~ not 一元補碼(位反轉)
<< shl 位左移
>> shr 位右移
**
**
型別轉換運算子允許將給定型別的值轉換為另一種型別。在c ++中有幾種方法可以做到這一點。最簡單的乙個,它是從c語言繼承而來的,是在(括號與)括號之間的型別轉換:
int i;
float f = 3.14;
i = (int) f;
前面的**將浮點數轉換為3.14整數值(3); 剩下的就丟了。這裡型別轉換操作符是(int)。在c ++中執行相同操作的另一種方法是在使用表示式之前的函式表示法按型別轉換並將表示式括在括號中:
i = int(f);
兩種型別轉換在c++中都是有效的。
sizeof
此運算子接受乙個引數,該引數可以是型別或變數,並返回該型別或物件的位元組大小:
x = sizeof (char);
這裡,x賦值為1,因為char是乙個大小為乙個位元組的型別。
返回的值sizeof是編譯時常量,因此始終在程式執行之前確定。
- 其他運算子
沒有寫只說在後面的教程中會有。
- 運算子的優先順序
單個表示式可能有多個運算子。例如:
運算子之位運算子
右移 負數 無符號右移 或 異或 與 非 說明 位運算子都是作用在二進位製上的 比如 n 50 n 1 結果是多少?100 n 2 結果是多少?200 n 5 結果是多少?1600 為什麼會是這樣的呢?運算的邏輯如下 1,n 50 2,n的二進位制是 0011 0010 3,0011 0010 左移...
C 之「運算子過載」
c 可以過載的運算子有 1.前置 和後置 2.前置 與後置 3.運算子 4.運算子 5.流提取與流插入 運算子 特別注意 要對類的物件使用運算子,不能過載的運算子 逗號運算子 includeusing namespace std class operate operate operate int x...
c 之運算子過載
運算子過載是一種形式的 c 多型。過載後的運算子必須至少有乙個運算元是使用者定義的型別。使用運算子時不能違反運算子原來的句法規則。不能建立新的運算子。名稱說明 sizeof sizeof 運算子 成員運算子 成員指標運算子 作用域解析運算子 條件運算子 typeid 乙個 rtti 運算子 cons...