1. 程式人生 > >自增操作符和箭頭操作符

自增操作符和箭頭操作符

1.自增和自減操作符

自增(++)和自減(--)操作符為物件加1或減1操作提供了方便簡短的實現方式。有前置和後置兩種使用形式。 前置操作使該運算元加1或減1,操作結果是修改後的值。後置運算元同樣對運算元加1或(減1),但操作後產生運算元原來的、未修改的值作為表示式的結果:
int i = 0, j;
j = ++i;  // j=1,i=1:prefix yields incremented value
j = i++; // j=1,i=2:postfix yields unincremented value

因為前置操作返回加1後的值,所以返回物件的本身,這是左值。而後置操作返回的則是右值。 建議:只有在必要時才使用後置操作符
因為前置操作需要做的工作更少,只需加1後返回加1後的結果即可。而後置操作則必須先儲存運算元之前的值,以便返回未加1之前的值作為操作的結果。對於 Int 型物件和指標,編譯器可優化掉這份額外工作。但是對於更多的複雜的迭代器型別,這種額外工作可能會話費更大的代價。因此,養成使用前置操作這個好習慣,就不必操心效能差異的問題。

1.1 後置操作符返回未加1的值

如果在單個複合表示式中使用變數的當前值,然後再加1時,通常使用後置的++和--。
vector<int> ivec;
int cnt = 10;
// add elements 10...1 to ivec
while (cnt > 0)
      ivec.push_back(cnt--);

1.2 在單個表示式中組合使用解引用和自增操作

下面的程式使用了一種非常通用的C++程式設計模式輸出ivec的內容:
vector<int>::iterator iter = ivec.begin();
// print 10 9 8...1
while (iter != ivec.end())
      cout << *iter++ <<endl;
由於後自增操作的優先順序高於解引用操作,因此*iter++等效於*(iter++)。字表達式iter++使iter加1,然後返回iter原值的副本作為該表示式的結果。因為解引用操作*的運算元是iter未加1之前的副本。       這種用法的根據在於後自增操作返回其運算元原值(沒有加1)的副本。如果返回的是加1後的值,則解引用該值將導致錯誤的結果:ivec的第一個元素沒有輸出,並企圖對一個多餘的元素進行解引用。 建議:簡介就是美
上面的輸出程式碼不採用下面這種冗長的等效程式碼:
cout << *iter << endl;
++iter;


2.箭頭操作符

C++語言為包含點操作符和解引用操作符的表示式提供了一個同義詞:箭頭操作符(->)。點操作符用於獲取類型別物件的成員:
item.same_isbn(item2); // run the same_isbn member of item1 
如果有一個指向Sale_item 物件的指標(或迭代器),則在使用點操作符前,需要對指標(或迭代器)進行解引用:
Sale_item *sp = &item1;
(*sp).same_isbn(item2); // run same_isbn on object to which sp points
這裡,對 sp 進行解引用以獲得指定的 Sales_item 物件。然後使用點操作符呼叫指定物件的same_isbn 成員函式。在上述用法中,注意必須用圓括號把解引用括起來,因為解引用的優先順序低於點操作符。如果漏掉圓括號,則這段程式碼的含義就完全不同了:
//run the same_isbn member of sp then dereference the result!
*sp.same_isbn(item2);  // error: sp has np member named same_isbn  
這個表示式企圖獲得sp 物件的same_isbn 成員。等價於:
*(sp.same_isbn(item2)); // equivalent to *sp.same_isbn(item2)
然而,sp是一個沒有成員的指標。這段程式碼無法通過編譯。     因為程式設計時很容易忘記圓括號,而且這類程式碼又經常使用,所以C++為在點操作符後使用的解引用操作定義了一個同義詞:箭頭操作符(->)。假設有一個指向類型別物件的指標(或迭代器),下面的表示式互相等價:
(*p).foo;  // dereference p to get an object and fetch its member named foo
p->foo; //equivalent way to fetch the foo from the object to which p points
具體地,可將same_isbn 的呼叫重寫為:
sp->same_isbn(item2);







相關推薦

操作符箭頭操作符

1.自增和自減操作符 自增(++)和自減(--)操作符為物件加1或減1操作提供了方便簡短的實現方式。有前置和後置兩種使用形式。 前置操作使該運算元加1或減1,操作結果是修改後的值。後置運算元同樣對運算元加1或(減1),但操作後產生運算元原來的、未修改的值作為表示式的結果:

C++中點操作符箭頭操作符的區別

/* * "."與"->"的區別 * "."的左邊必須是結構體名/物件名的實體 * "->":的左邊必須是結構體名/物件名的指標 * 輸出:輸入年月日時分秒,並且輸出,輸出形式為年/月/日

C++點操作符箭頭操作符

相同點:兩個都是二元操作符,其右操作符是成員的名稱。  主要看左邊的操作符,左邊是指標用箭頭,否則用點操作符 不同點:點操作符左邊的運算元是一個“結果為結構”的表示式;                 箭頭操作符左邊的運算元是一個指向結構的指標。 首先介紹一下C

關於C/C++中的點操作符箭頭操作符

點操作符 “.”用來引用普通物件。 箭頭操作符“->”用來引用指標物件。 舉例子說明一下: 比如,我有一個物件darkray。那麼我可以通過”.”來呼叫darkray類中中的成員變數。 但是如果darkray是指標的話,就不能通過”.”來呼叫,而只能使用”->”

C++中箭頭操作符操作符

    舉個例子: struct MyStruct { int member_a; };   (1)假設有個變數:MyStruct s,這個變數是一個類型別物件,那麼獲取物件

SQL SERVER 查找出不含計算欄位的定義函式

IF EXISTS (SELECT * FROM sysobjects WHERE name = 'B_GetTableWithOutCompute' AND user_name(uid) = 'dbo')     DROP FUNCTION B_GetTableWithOu

i++i--那點兒事兒(運算子減運算子)

自增++分為字首和字尾,字首++i是先自加1後在使用i,字尾式i++是先使用在自加1; 自減--分為字首和字尾,字首--i是先自減1在使用,字尾i--是先使用在自減1; package test; public class HelloWorld { public static vo

獲取mysql id mysql 下一個id的方法

mysql獲取表中自增id的方法: 1. 使用 select MAX(id) from tablename; 獲取的是表中最大的id;順序執行  insert ---> delete 插入的資料----> select MAX(id) from tablenam

過載運算子(前置++p後置p++)

如何過載增量運算子 ++ 和 --     運算子++和—有前置和後置兩種形式,如果不區分前置和後置,則使用operator++( )或operator--( )即可;否則,要使用operator++( )或operator--( )來過載前置運算子,使用operator+

SQL Server 儲存過程insert(valuesort)

--select * from tblDJCodeNamealter proc demo_codename_insert@codetype varchar(20),@name varchar(20),@value int outputas declare @max int,

C++學習筆記42——過載操作符箭頭操作符

 箭頭(->)操作符,看起來很像二元操作符,左運算元是類物件,右運算元是類成員,即使如此,箭頭操作符的過載函式是沒有第二個形參的(第一個是隱含形參this),理解起來有點難度;  函式語句為:  a->b;(其中,b可以是函式或者成員;)  步驟1. 如果a是指

邏輯操作符關係操作符

!  邏輯非  !expr  <  小於    expr < expr <= 小於等於  expr <= expr >  大於    expr > expr >= 大於等於  expr >= expr ==  相等  

操作符

自增(++)和自減(--)操作符為物件加1和減1操作提供了方便簡短的實現方式.它們有前置或後置兩種使用形式.到目前為止,我們已經使用過前自增操作,該操作使其運算元加1,操作結果是修改後(changed)的值.同理,前自減操作使其運算元減1.這兩種操作符的後置形式同樣對其運算元

[C++] 指標操作符簡潔的寫法

陣列複製:// arr1 is an array of ints int *source = arr1; size_t sz = sizeof(arr1)/sizeof(*arr1); // number of elements int *dest = new int[sz]

Java操作符——++/--的那些事

說明 align 面試 程序 nbsp double 之前 div 概述 1. 概述 自增操作符(++)和自減操作符(--)是對變量進行加1和減1的操作。 2.分類說明 ++和--是對變量進行自增1和自減1的簡寫操作符。許多編程任務中經常需要對變量

3 More Effective C++—條款6(定義/操作符

1 過載操作符 C++允許使用者自定義自增、自減操作符。兩種操作符都有對應的前置、後置形式。如下所示: index++ // 返回原值,並自增 ++index // 自增,並返回新值 index-- --index 過載操作符如下程式碼所示。由於前置(pref

c++實現日期類(class Date) 建構函式 拷貝構造 操作符過載(輸入輸出 比較操作 算數運算 減)

註釋比較詳細,可以直接跑起來,直接上程式碼(vs2012 win7) 一、標頭檔案 /************** Date.h ***************/ #pragma once #include <iostream> using name

JS( +號操作符)、加一,減一 ( ++- -)、(比較操作符)、邏輯與操作符

JS( +號操作符):操作符是用於在JavaScript中指定一定動作的符號。(1)操作符看下面這段JavaScript程式碼。sum = numa + numb;其中的"="和"+"都是操作符。JavaScript中還有很多這樣的操作符,例如,算術操作符(+、-、*、/等)

Java中的操作符與中間快取變數機制

我們來看這樣一段程式: public static void main(String[] args){ int i, sum1, sum2; i=0; sum1 = (i++)+(i++); System.out.pri

Python 為什麼不支援 i++ 語法,不提供 ++ 操作符

在 C/C++/Java 等等語言中,整型變數的自增或自減操作是標配,它們又可分為字首操作(++i 和 --i)與字尾操作(i++ 和 i--),彼此存在著一些細微差別,各有不同的用途。 這些語言的使用者在接觸 Python 時,可能會疑惑為什麼它不提供 ++ 或 -- 的操作呢?在我前不久發的《[Pyth