English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

C++ 運算子優先級和關聯性

在本教程中,我們將借助示例來了解C ++中運算子的優先級和關聯性。

C ++運算子優先級

如果單個表達式中有多個運算子,則不會同時評估這些運算。 相反,具有較高優先級的運算子將首先對其操作進行評估。

讓我們看一個實例:

int x = 5 - 17 * 6;

在此,乘法運算子 * 的優先級高於減法運算子 - 。因此,17 * 6首先進行評估。

結果,以上表達式等效於

int x = 5 - (17 * 6);

如果我們想先進行評估5 - 17,則必須將它們放在括號內:

int x = (5 - 17) * 6;

示例1:運算子優先級

#include <iostream>
using namespace std;
int main() {
  //首先評估17 * 6
  int num1 = 5 - 17 * 6;
  //與num1等效的表達式
  int num2 = 5 - (17 * 6);
  //強制編譯器首先評估5-17
  int num3 = (5 - 17) * 6;
  cout << "num1 = " << num1 << endl;
  cout << "num2 = " << num2 << endl;
  cout << "num3 = " << num3 << endl;
  return 0;
}

结果输出

num1 = -97
num2 = -97
num3 = -72

注意:由於C ++中有許多運算子具有多個優先級,因此強烈建議我們使用括號使代碼更具可讀性。

C ++運算子優先級表

下表顯示了C ++運算子的優先級。優先級1表示優先級最高的運算子,而優先級17表示優先級最低的運算子。

優先級
運算子
描述結合律
1::範圍Da sinistra a destra
2a++
a--
type( )
type{ }
a( )
a[ ]
.
->
Incremento posteriore
Decremento/scremento posteriore

Conversione di stile funzione

Conversione di stile funzione

Chiamata di funzione
Indice
Accedi ai membri dell'oggetto
Accedi ai membri dell'oggetto da ptr
Da sinistra a destra
3++a
--a
+a
-a
!
~
(type)
*a
&a
sizeof
co_await
new new[ ]
delete delete[]
Incremento prefisso
Decremento prefisso
Positivo
Negativo
Negazione logica
Negazione bit a bit
Conversione C-style
Indiretto (de-referenziamento)
Indirizzo
Dimensione
Espressione await
Assegnamento della memoria dinamica
Rilascio della memoria dinamica
Da destra a sinistra
4.*
->*

Selettore di oggetto membro

Selettore di puntatore membro

Da sinistra a destra
5a * b
a / b
a % b

Moltiplicazione

Divisione

Modulo

Da sinistra a destra
6a + b
a - b
Addizione
Sottrazione
Da sinistra a destra
7<<
>>

Shift a sinistra bit a bit

Shift a destra bit a bit

Da sinistra a destra
8<=>Operatori di confronto ternarioDa sinistra a destra
9<
<=
>
>=
Less
Less than or equal
Greater
Greater than or equal
Da sinistra a destra
10==
!=

Uguale

Non uguale

Da sinistra a destra
11&AND bit a bitDa sinistra a destra
12^XOR bit a bitDa sinistra a destra
13|OR bit a bitDa sinistra a destra
14&&AND logicoDa sinistra a destra
15||OR logicoDa sinistra a destra
16a ? b : c
throw
co_yield
=
+=
-=
*=
/=
%=
<<=
>>=
&=
^=
|=
Operatore condizionale ternario
Operatore throw
Espressione yield (C++ 20)
Assegnamento
Assegnamento addizione
Assegnamento sottrazione
Assegnamento moltiplicazione
Distribuzione di divisione
Assegnamento modulo
Assegnamento di shift a sinistra bit a bit
Assegnamento di shift a destra bit a bit
Assegnamento di AND bit a bit
Assegnamento di XOR bit a bit
Assegnamento di OR bit a bit
Da destra a sinistra
17,Operatore virgolaDa sinistra a destra

AssociazioneL'attributo di natura sarà discusso in seguito.

L'associazione degli operatori C++

L'associazione degli operatori è il calcolo dell'espressioneDirezioneAd esempio,

int a = 1;
int b = 4;
// a = 4
a = b;

Vedere l'istruzione a=4; = L'associazione dell'operatore = è da destra a sinistra. Pertanto, il valore di b viene assegnato a a.

Allo stesso modo, più di un operatore può avere la stessa priorità (come indicato nella tabella sopra). Quando si utilizzano più operatori con la stessa priorità nell'espressione, verranno valutati in base alla loroAssociazioneValutarli.

int a = 1;
int b = 4;
b += a -= 6;

Gli operatori += e -= hanno la stessa priorità. Poiché l'associazione di questi operatori è da destra a sinistra, questo è il modo in cui viene valutata l'ultima istruzione.

  • a -= 6 Valutazione iniziale. Pertanto, a sarà-5

  • 然后,b += -5将被评估。因此,b将为-1

示例2:关联性运算符

#include <iostream>
using namespace std;
int main() {
  int a = 1;
  int b = 4;
// a -= 6 首先进行评估
  b += a -= 6;
  cout << "a = " << a << endl; ;
  cout << "b = " << b;
}

结果输出

a = -5
b = -1