<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C++入門之表達式

jf_78858299 ? 來源:QStack ? 作者:月下西樓 ? 2023-03-17 13:55 ? 次閱讀

背景

C++中提供了很多操作符且定義了什么時候可以用于操作基本類型,其還允許我們定義用于操作class類型的操作符,接下來幾篇文章將會介紹C++中用于基本類型的操作符,與此同時也會介紹一些庫中操作符。一個表達式是由一個或多個操作符組成的并且返回一個結果。一個最簡單的表達式就是一個變量或者字面量,更加復雜的表達式是由一個操作符和一個或多個操作數組成。

基礎知識

C++中有一些影響表達式計算的基礎概念,所以我們在使用前需要先了解一下這些基本概念。

基本概念

C++中有一元運算符也有二元運算符,一元運算符就像是地址操作符&或者是解引用操作符,都是作用于一個操作數。類似==就是二元操作符,是作用在兩個操作數上的。還有一個三元運算符,其可以操作三個操作數,函數調用則不限制操作數的數量。其中像即可以是一元運算符(解引用符),也可以是二元運算符(乘法符號),在實際使用中由其所處的上下文環境決定。

理解這么多運算符需要理解運算符的優先級和結合性,這取決于操作數的運算順序,以下就是一個例子,*操作符的操作數可以是10和20,也可以是是10和20/2,或者是15和20/2,該如何理解這個表達式呢,接下來我們詳細說明。

操作數轉換

作為計算表達式的一部分,操作數會經常從一個類型轉換為另一個類型,例如二元運算符通常希望兩個操作數是同一個類型,這些運算符可以用于不同類型的操作數只要兩個操作可以轉化為同一個類型。例如我們可以將一個整型轉化成一個浮點型,但是我們無法將一個指針類型轉化為一個浮點型。

運算符重載

C++定義了應用于基本類型和復合類型的操作符含義,我們自己可以定義操作符作用于class類型時操作符的含義,這種定義給了已有操作符的其他含義,這種我們稱之為運算符重載。IO庫中的<<和>>操作符就是重載遠算符。

當我們使用重載運算符時,運算符的含義。操作數和最后的結果都取決于運算符是如何定義的,但是操作數的數量和優先級和結合性是不會改變的。

左值和右值

C++中的表達式不是左值(rvalue)就是右值(rvalue),這個名稱是從C中繼承過來的,其是為了好記憶,左值可以在賦值的左邊,右值則不可以。在C++中左值和右值更好區分,一個左值表達式代表一個對象或者一個函數,然而需要注意的是一些左值表達式如const對象不能作為賦值操作符的左操作數。而且一些表達式產生對象但是是返回右值而不是返回左值??偟膩碚f,當我將一個對象當作右值使用時返回的他的值,當作左值使用時返回的是其地址。

操作符在需要左值或者右值以及返回左值或者右值時是不同的,我們可以將一個左值當作右值使用,但是卻不能將右值當作左值使用。

當使用decltype時左值和右值也不同,當我對一個表達式使用decltype,如果表達式返回的是左值,函數返回則是引用,例如如果p 是int 類型,decltype(p)返回的時int&,如果運算表達式是右值如地址操作符如decltype(&p)返回int , 這是一個指針,指向一個指向int類型的指針。

優先級和結合性

一個表達式包含兩或兩個個以上的操作符的表達式是復合表達式,計算一個復合表達式需要將利用操作符將操作數分組,優先級和結合性決定如何分組,開發者也可以通過括號來強制分組。

通常表達式的值依賴于子表達式如何分組,操作數將會和優先級高的操作符結合在一起,例如乘和除的優先級相同,但是他們的優先級比加高,所以要先算乘除,后算加減。在優先級的相同的情況下由結合性決定如何分組,算術操作符是向左結合,這意味著在優先級相同的情況下從左向右分組:

  • 因為優先級所以3 + 4 * 5結果是23而不是35
  • 因為結合性所以20 - 15 - 3是2而不是8

運算順序

優先級決定了操作數如何被分組,但是其并未確定哪一個操作數先被運算,在絕大多數情況下這個順序是不固定的,例如在下面的例子中,我們知道f1和f2必須要在乘法執行前調用,然后將他們的結果相乘,但是我們并不知道f1和f2哪個先調用:

int i = f1() * f2();

對于沒有指定運算順序的操作符而言,一個表達式指向并改變同一個對象會發生錯誤,這么做的表達式會引發未定義的錯誤。一個簡單的例子,<< 操作符并不指定操作數的運算順序,其結果就是輸出表達式未知。

int i = 0;
std::cout<

有四個運算符是保證操作數的遠算順序,&&操作符先運算左邊,只有左邊為true才會運算右邊,|| , ?:和,也會確定操作順序。

成員獲取操作符

點操作符.和箭頭操作符->都能獲取到成員,點操作符可以獲取到class類型的成員,而箭頭操作符可以獲取到指針的成員:

string s1 = "a string", *p = &s1;
auto n = s1.size();
n = (*p).size();
n = p->size(); //等價于(*p).size()

?由于解引用符有優先級低于點操作符,所以我們需要使用括號改變遠算順序

?

條件操作符

條件操作符能夠簡化if-else的邏輯結構,通常的使用形式如下

cond?expr1 : expr2;

其中cond是一個條件,如果cond為true,運算expr1,反之則運算expr2,例子如下

string finalgrade = (grade < 60)? "failed" : "pass";

條件操作符也可以嵌套:

finalgrade = (grade > 90) ? "high pass": (grade < 60) ? "fail" : "pass";
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C++
    C++
    +關注

    關注

    21

    文章

    2067

    瀏覽量

    72961
  • Class
    +關注

    關注

    0

    文章

    52

    瀏覽量

    19620
  • 操作符
    +關注

    關注

    0

    文章

    20

    瀏覽量

    9002
收藏 人收藏

    評論

    相關推薦

    C語言:指針表達式

    字符'b' printf("%c\n",*cp);//還是字符'a' return 0;}*(cp+1)在前面的表達式中增加了一個括號。這個括號使表達式先執行加法運算,就是把1和cp中所
    發表于 01-11 13:41

    C,C++表達式求值順序超詳解

    經??梢栽谝恍┯懻摻M里看到下面的提問:“誰知道下面C語句給n賦什么值?”m = 1; n = m+++m++;最近有位不相識的朋友發email給我,問為什么在某個C++系統里,下面表達式打印出兩個4,而不是4和5:a = 4;
    發表于 12-08 14:30

    【LabVIEW懶人系列教程-小白入門】1.7LabVIEW數據操作表達式

    ③利用公式節點需要注意的是,公式節點的語法類似c語言,但是有差異,務必參考幫助中的語法使用。驗證正確今日總結①如何利用數學函數編寫表達式② 如何利用表達式節點編寫表達式 ③如何利用公式
    發表于 07-29 00:48

    表達式求值是什么意思

    嵌入式C語言入門——表達式求值
    發表于 12-15 06:24

    防范表達式的失控

    在C 語言中,表達式是最重要的組成部分之一,幾乎所有的代碼都由表達式構成。表達式的使用如此廣泛,讀者也許會產生這樣的疑問,像+ 、- 、3 、/ 、& & 這樣簡單的運算也會出現
    發表于 04-22 16:57 ?13次下載

    PHP正則表達式

    PHP正則表達式,PHP建設必備的的工具,初學者簡單易懂快速入門,高手進階手冊。
    發表于 04-18 10:46 ?0次下載

    快速入門IPv6和正則表達式

    對于日常開發中只接觸IPv4,并沒有深入研究過正則表達式的開發者,面對IPv6和正則表達式,容易產生畏懼心理,覺得是兩座難以翻越的大山。本文通過一些表格整理對IPv6的表示方法,以及正則表達式的特殊符號進行了分類和說明,帶領大家
    的頭像 發表于 03-30 09:31 ?8507次閱讀
    快速<b class='flag-5'>入門</b>IPv6和正則<b class='flag-5'>表達式</b>

    C++入門教程之數據類型、運算符和表達式的詳細資料說明

    本文檔的詳細介紹的是C++入門教程之數據類型、運算符和表達式的詳細資料說明。主要內容包括了: 基本數據類型 常量和變量 輸入輸出 運算符和表達式 數據類型的轉換 構造數據類
    發表于 02-15 11:26 ?2次下載
    <b class='flag-5'>C++</b><b class='flag-5'>入門</b>教程之數據類型、運算符和<b class='flag-5'>表達式</b>的詳細資料說明

    C++程序設計教程之數據類型與表達式的詳細資料說明

    本文檔的主要內容詳細介紹的是C++程序設計教程之數據類型與表達式的詳細資料說明包括了:1 . C++的數據類型,2 . 常量,3 . 變量,4 . C++的運算符,5 . 算術運算符與
    發表于 03-14 14:48 ?0次下載
    <b class='flag-5'>C++</b>程序設計教程之數據類型與<b class='flag-5'>表達式</b>的詳細資料說明

    Python正則表達式指南

    本文介紹了Python對于正則表達式的支持,包括正則表達式基礎以及Python正則表達式標準庫的完整介紹及使用示例。本文的內容不包括如何編寫高效的正則表達式、如何優化正則
    發表于 03-26 09:13 ?10次下載
    Python正則<b class='flag-5'>表達式</b>指南

    Lambda表達式詳解

    C++11中的Lambda表達式用于 **定義并創建匿名的函數對象** ,以簡化編程工作。下面看一下Lambda表達式的基本構成。
    的頭像 發表于 02-09 11:28 ?873次閱讀

    表達式與邏輯門之間的關系

    邏輯表達式是指表示一個表示邏輯運算關系的式子,是一個抽象的類似數學表達式,下面我們重點說明下其表達式與邏輯門之間的關系。
    的頭像 發表于 02-15 14:54 ?1201次閱讀
    <b class='flag-5'>表達式</b>與邏輯門之間的關系

    C語言的表達式

    在C語言中,表達式是由操作符和操作數組成。表達式可以由一個或者多個操作數組成,不同的操作符與操作數組成不同的表達式,因此,表達式才是C語言的基本。
    的頭像 發表于 02-21 15:09 ?1003次閱讀
    C語言的<b class='flag-5'>表達式</b>

    Linux入門之正則表達式

    正則表達式是用來表達字符串匹配模式的方法,利用正則表達式,可以讓我們輕易地實現對目標字符串的**查找**、**刪除**、**替換**等操作。 正則表達式并不復雜,它并不包含難以理
    的頭像 發表于 05-12 15:31 ?602次閱讀
    Linux<b class='flag-5'>入門</b>之正則<b class='flag-5'>表達式</b>

    zabbix觸發器表達式 基本RS觸發器表達式 rs觸發器的邏輯表達式

    zabbix觸發器表達式 基本RS觸發器表達式 rs觸發器的邏輯表達式? Zabbix是一款開源的監控軟件,它能通過監控指標來實時監測服務器和網絡的運行狀態,同時還能提供警報和報告等功能來幫助管理員
    的頭像 發表于 08-24 15:50 ?1276次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>