欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

探究C++中指針與數(shù)組運(yùn)算符優(yōu)先級(jí)

 更新時(shí)間:2024年10月05日 09:35:50   作者:菲杰克PhyJack  
C++中與指針和數(shù)組相關(guān)的運(yùn)算符優(yōu)先級(jí),通過(guò)實(shí)際代碼示例解釋了運(yùn)算符的左結(jié)合與右結(jié)合方式,以及如何使用圓括號(hào)()來(lái)改變默認(rèn)的結(jié)合順序,文章還提供了一個(gè)優(yōu)先級(jí)表,列出了運(yùn)算符的優(yōu)先級(jí)和結(jié)合性,幫助讀者更好地理解復(fù)雜表達(dá)式中運(yùn)算符的調(diào)用順序

C++中與指針和數(shù)組相關(guān)的運(yùn)算符優(yōu)先級(jí),通過(guò)實(shí)際代碼示例解釋了運(yùn)算符的左結(jié)合與右結(jié)合方式,以及如何使用圓括號(hào)()來(lái)改變默認(rèn)的結(jié)合順序,文章還提供了一個(gè)優(yōu)先級(jí)表,列出了運(yùn)算符的優(yōu)先級(jí)和結(jié)合性,幫助讀者更好地理解復(fù)雜表達(dá)式中運(yùn)算符的調(diào)用順序,特別對(duì)于同時(shí)存在左結(jié)合和右結(jié)合運(yùn)算符的情況,給出了詳細(xì)的分析和示例,使讀者能夠深入理解運(yùn)算符優(yōu)先級(jí)的實(shí)際應(yīng)用

指針、數(shù)組相關(guān)的運(yùn)算符優(yōu)先級(jí)

下表展示了相關(guān)運(yùn)算符的優(yōu)先級(jí),有4個(gè)級(jí)別,同級(jí)別內(nèi)的運(yùn)算符按照結(jié)合性依次調(diào)用。這4類(lèi)也是所有運(yùn)算符中優(yōu)先級(jí)最高的4檔,其它的運(yùn)算符優(yōu)先級(jí)都比它們低:

優(yōu)先級(jí)運(yùn)算符描述結(jié)合性
1::作用域解析左結(jié)合
2()
[]
.
->
強(qiáng)制運(yùn)算結(jié)合,函數(shù)形參列表
數(shù)組元素下標(biāo)訪問(wèn)
類(lèi)的成員訪問(wèn)
類(lèi)指針的成員訪問(wèn)
右結(jié)合
3(int)
*
&
強(qiáng)制轉(zhuǎn)換
指針解引用
變量取地址
左結(jié)合
4.*
->*
類(lèi)的成員函數(shù)指針
類(lèi)指針的成員函數(shù)指針
左結(jié)合

容易產(chǎn)生困惑的、需要仔細(xì)進(jìn)行優(yōu)先級(jí)判斷的往往是一個(gè)左結(jié)合加一個(gè)右結(jié)合,例如:

  • *ptr[]
  • (int)a()
  • &obj->data
  • obj->*fun()

請(qǐng)記住一個(gè)重要方法:當(dāng)我們需要改變運(yùn)算符的結(jié)合順序(C++默認(rèn)的優(yōu)先級(jí)不是我們的意愿)時(shí),可以通過(guò)添加()來(lái)人為強(qiáng)制指定優(yōu)先順序,因?yàn)?strong>()是除了::以外具有最高優(yōu)先級(jí)的一類(lèi)運(yùn)算符。

簡(jiǎn)單例子:以[]和*為例探討運(yùn)算符結(jié)合規(guī)律

下面的p1, p2是數(shù)組,p3是指針:

int *p1[2];    // p1是一個(gè)數(shù)組,元素個(gè)數(shù)為2,每個(gè)元素為(int*)
int *(p2[2]);  // 等價(jià)于*p2[2],p2是一個(gè)數(shù)組
int (*p3)[2];  // p3是一個(gè)指針,指向一個(gè)int數(shù)組,這個(gè)int數(shù)組的元素個(gè)數(shù)必須是2!

因此只要記住兩點(diǎn)即可:

  • []的優(yōu)先級(jí)高于*:即*p1[2]*(p1[2])等價(jià)。
  • 這個(gè)優(yōu)先級(jí)同時(shí)適用于定義語(yǔ)句(*為指針定義符)執(zhí)行語(yǔ)句(*為解引用符)中:
int *p1[2];    // 定義語(yǔ)句:先看[]:p1是一個(gè)數(shù)組,元素個(gè)數(shù)為2,每個(gè)元素為(int*)。等價(jià)于*(p1[2])
int (*p2)[2];  // 定義語(yǔ)句:先看*: p2是一個(gè)指針,指向一個(gè)int數(shù)組,這個(gè)int數(shù)組的元素個(gè)數(shù)必須是2!
cout << "*p1[0] = " << *p1[0] << endl;     // 執(zhí)行語(yǔ)句:先看[]:先取第0個(gè)元素,再解引用。等價(jià)于*(p1[0])
cout << "(*p2)[0] = " << (*p2)[0] << endl; // 執(zhí)行語(yǔ)句:先看*:先解引用,再取第0個(gè)元素

完整示例:

#include <iostream>
using namespace std;

int main(){	
	// []的優(yōu)先級(jí)高于*,因此下面的p1是數(shù)組,p2是指針:
	int *p1[2];    // p1是一個(gè)數(shù)組,元素個(gè)數(shù)為2,每個(gè)元素為(int*)。等價(jià)于*(p1[2])
	int (*p2)[2];  // p2是一個(gè)指針,指向一個(gè)int數(shù)組,這個(gè)int數(shù)組的元素個(gè)數(shù)必須是2!
	int a = 1, b = 2;
	int c[2] = {4,5};
	p1[0] = &a;
	p1[1] = &b;
	p2 = &c;
	cout << "*p1[0] = " << *p1[0] << endl;
	cout << "*p1[1] = " << *p1[1] << endl;
	cout << "*(p1[0]) = " << *(p1[0]) << endl;  // 與上面兩條等價(jià)
	cout << "*(p1[1]) = " << *(p1[1]) << endl;
	cout << "(*p2)[0] = " << (*p2)[0] << endl;  
	cout << "(*p2)[1] = " << (*p2)[1] << endl;
	
	return 0;
}

輸出:

*p1[0] = 1
*p1[1] = 2
*(p1[0]) = 1
*(p1[1]) = 2
(*p2)[0] = 4
(*p2)[1] = 5

復(fù)雜例子:探討當(dāng)左結(jié)合和右結(jié)合運(yùn)算符同時(shí)存在時(shí)如何界定優(yōu)先級(jí)

下面的例子比較復(fù)雜,需要耐心仔細(xì)閱讀和體會(huì)。如果這個(gè)例子能搞清楚,那么相信你對(duì)運(yùn)算符優(yōu)先級(jí)的理解將會(huì)上升一個(gè)檔次。

這個(gè)例子研究了當(dāng)左結(jié)合和右結(jié)合運(yùn)算符同時(shí)存在時(shí)的結(jié)合順序,同時(shí)也演示了可以使用()強(qiáng)制人為指定結(jié)合順序:

#include <iostream>
#include <string>
using namespace std;

class Student{
public:
	Student(string name, int id):_name(name),_id(id){}
	void printInfo(){
		cout << "I am a student. My name is " << _name << ". My id is " << _id << endl;
	}
	void operator()(){
		printInfo();
	}
protected:
	string _name;
	int _id;
};

class Student2 : public Student{
public:
	Student2(string name, int id):Student(name, id){}
	void printInfo(){
		cout << "I am a super Student!!! " << endl;
	}
	void operator()(){
		cout << "I am Student2!!!" << endl;
	}
};

struct StudentWrapper{
	Student* _ps;
	StudentWrapper(Student* ps):_ps(ps){}
	Student* operator()(){return _ps;}
};

int main(){	
	// .和(), ->和()平級(jí):從左向右
	cout << "-----------------1------------------" << endl;
	Student s1("Bob",101), s2("Jack", 102);
	Student *ps1 = new Student("Eric",103);
	s1.printInfo();
	s2.printInfo();
	ps1->printInfo();

	// .高于*:先結(jié)合.
	cout << "-----------------2------------------" << endl;
	// 下面這條語(yǔ)句報(bào)錯(cuò):先調(diào)用.printInfo(),再*,因此會(huì)報(bào)錯(cuò)
	// *ps1.printInfo();  // error: request for member 'printInfo' in 'ps1'
	(*ps1).printInfo(); 
			
	// .和()高于*:先結(jié)合()和.(從右向左),最后結(jié)合*
	cout << "-----------------3------------------" << endl;
	StudentWrapper sw(ps1);
	// 下面這條語(yǔ)句報(bào)錯(cuò):先結(jié)合sw(),再結(jié)合.printInfo(),最后結(jié)合*,因此會(huì)報(bào)錯(cuò)
	// *sw().printInfo(); // error: request for member 'printInfo' in 'sw.StudentWrapper::operator()()'
	(*sw()).printInfo(); // correct:先sw(),再*sw(),再(*sw()).printInfo()
	// 下面這條語(yǔ)句報(bào)錯(cuò):先結(jié)合sw(),再結(jié)合(),最后結(jié)合*,因此會(huì)報(bào)錯(cuò)
	// *sw()(); // error: expression cannot be used as a function
	(*sw())(); // correct:先sw(),再*sw(),再(*sw())()

	// (int)和()/[]:先結(jié)合()和[],再?gòu)?qiáng)轉(zhuǎn)
	cout << "-----------------4------------------" << endl;
	Student2 ss("Alice", 999), sss("Jason", 998), ssArray[2] = {ss, sss};
	ss();   // 調(diào)用Student2::operator()
	// 下面這條語(yǔ)句報(bào)錯(cuò),因?yàn)闀?huì)先結(jié)合ss(),再?gòu)?qiáng)制轉(zhuǎn)換
	// (Student)ss(); // error: invalid use of void expression
	((Student)ss)(); // correct: 調(diào)用Student::operator()
	// 下面這條語(yǔ)句報(bào)錯(cuò),因?yàn)闀?huì)先結(jié)合ssArray[0], 再ssArray[0](),再?gòu)?qiáng)制轉(zhuǎn)換
	// (Student)ssArray[0](); // error: invalid use of void expression
	((Student)ssArray[1])(); // correct:將ssArray[1]強(qiáng)制轉(zhuǎn)換為Student類(lèi)型后,調(diào)用其()方法

	// ()高于.*和->*:先結(jié)合()
	cout << "-----------------5------------------" << endl;
	void (Student::*fp)();
	fp = Student::printInfo;
	// s1.*fp();   // error: must use '.*' or '->*' to call pointer-to-member function in 'fp (...)'
	(s1.*fp)();
	(s2.*fp)();
	// ps1->*fp(); // error: must use '.*' or '->*' to call pointer-to-member function in 'fp (...)'
	(ps1->*fp)(); 
	
	// (int)高于.*和->*:先結(jié)合(int)
	cout << "-----------------6------------------" << endl;
	Student2 *ssp = &sss;   // Jason
	void (Student2::*fp2)();
	fp2 = Student2::printInfo;
	(ss.*fp2)();
	((Student)ss.*fp)();  // 先將ss強(qiáng)轉(zhuǎn)為Student,然后調(diào)用Student::printInfo(),注意是.*fp而不是.*fp2
	((Student*)ssp->*fp)();  // 先將ssp強(qiáng)轉(zhuǎn)為Student*,然后調(diào)用Student::printInfo(),注意是.*fp而不是.*fp2

	// *高于.*和->*:先結(jié)合*
	cout << "-----------------7------------------" << endl;
	(*ssp.*fp2)();   // 先*ssp,再.*fp2
	Student2 **sspp = &ssp;
	(*sspp->*fp2)(); // 先*sspp,再->*fp2
	
	delete ps1;
	return 0;
}

輸出:

-----------------1------------------
I am a student. My name is Bob. My id is 101
I am a student. My name is Jack. My id is 102
I am a student. My name is Eric. My id is 103
-----------------2------------------
I am a student. My name is Eric. My id is 103
-----------------3------------------
I am a student. My name is Eric. My id is 103
I am a student. My name is Eric. My id is 103
-----------------4------------------
I am Student2!!!
I am a student. My name is Alice. My id is 999
I am a student. My name is Jason. My id is 998
-----------------5------------------
I am a student. My name is Bob. My id is 101
I am a student. My name is Jack. My id is 102
I am a student. My name is Eric. My id is 103
-----------------6------------------
I am a super Student!!!
I am a student. My name is Alice. My id is 999
I am a student. My name is Jason. My id is 998
-----------------7------------------
I am a super Student!!!
I am a super Student!!!

到此這篇關(guān)于探究C++中指針與數(shù)組運(yùn)算符優(yōu)先級(jí)的文章就介紹到這了,更多相關(guān)C++指針和數(shù)組運(yùn)算符優(yōu)先級(jí)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言順序表的基本結(jié)構(gòu)與實(shí)現(xiàn)思路詳解

    C語(yǔ)言順序表的基本結(jié)構(gòu)與實(shí)現(xiàn)思路詳解

    順序表是用一段物理地址連續(xù)的存儲(chǔ)單元依次存儲(chǔ)數(shù)據(jù)元素的線性結(jié)構(gòu),一般情況下采用數(shù)組存儲(chǔ)。本文將通過(guò)示例為大家講解一下順序表的基本操作,需要的可以參考一下
    2023-02-02
  • VSCode配置C語(yǔ)言環(huán)境的方法

    VSCode配置C語(yǔ)言環(huán)境的方法

    這篇文章主要介紹了VSCode配置C語(yǔ)言環(huán)境的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • OpenCV圖像處理之圖像拼接詳解

    OpenCV圖像處理之圖像拼接詳解

    本文主要介紹了如何使用C++?OpenCV實(shí)現(xiàn)圖像景拼接,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)OpenCV有一定的幫助,感興趣的可以了解一下
    2022-08-08
  • C++中幾種將整數(shù)轉(zhuǎn)換成二進(jìn)制輸出的方法總結(jié)

    C++中幾種將整數(shù)轉(zhuǎn)換成二進(jìn)制輸出的方法總結(jié)

    下面小編就為大家?guī)?lái)一篇C++中幾種將整數(shù)轉(zhuǎn)換成二進(jìn)制輸出的方法總結(jié)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-09-09
  • C++中g(shù)etline()的用法詳解

    C++中g(shù)etline()的用法詳解

    這篇文章主要介紹了C++中g(shù)etline()的用法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • Qt實(shí)現(xiàn)可拖動(dòng)按鈕

    Qt實(shí)現(xiàn)可拖動(dòng)按鈕

    這篇文章主要為大家詳細(xì)介紹了Qt實(shí)現(xiàn)可拖動(dòng)按鈕,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • 基于C語(yǔ)言實(shí)現(xiàn)個(gè)人通訊錄管理系統(tǒng)

    基于C語(yǔ)言實(shí)現(xiàn)個(gè)人通訊錄管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了基于C語(yǔ)言實(shí)現(xiàn)個(gè)人通訊錄管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • 利用C++簡(jiǎn)單實(shí)現(xiàn)順序表和單鏈表的示例代碼

    利用C++簡(jiǎn)單實(shí)現(xiàn)順序表和單鏈表的示例代碼

    這篇文章主要給大家介紹了關(guān)于利用C++簡(jiǎn)單實(shí)現(xiàn)順序表和單鏈表的方法,文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí),需要的朋友可以參考借鑒,下面來(lái)跟著小編一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。
    2017-08-08
  • C語(yǔ)言野指針及如何規(guī)避詳解

    C語(yǔ)言野指針及如何規(guī)避詳解

    這篇文章主要為大家介紹了C語(yǔ)言野指針及如何規(guī)避詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • C++面試八股文之位運(yùn)算問(wèn)題詳解

    C++面試八股文之位運(yùn)算問(wèn)題詳解

    這篇文章主要為大家介紹了C++面試八股文之位運(yùn)算的問(wèn)題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06

最新評(píng)論