C++
संचालक वरीयता
खोज…
टिप्पणियों
अवरोही क्रम में ऑपरेटर ऊपर से नीचे सूचीबद्ध हैं। समान संख्या वाले संचालकों में समान पूर्वता और समान संगति होती है।
-
::
- उपसर्ग ऑपरेटर:
[]
()
T(...)
.
->
++
--
dynamic_cast
static_cast
reinterpret_cast
const_cast
typeid
- यूनियरी उपसर्ग ऑपरेटर:
++
--
*
&
+
-
!
~
sizeof
new
delete
delete[]
; सी-स्टाइल कास्ट नोटेशन,(T)...
; (सी ++ 11 और ऊपर)sizeof...
alignof
noexcept
-
.*
और->*
-
*
,/
, और%
, बाइनरी अंकगणितीय ऑपरेटर -
+
और-
, बाइनरी अंकगणितीय ऑपरेटर -
<<
और>>
-
<
,>
,<=
>=
-
==
और!=
-
&
, बिटवाइज़ और ऑपरेटर -
^
-
|
-
&&
-
||
-
?:
(टर्नरी सशर्त ऑपरेटर) -
=
,*=
,/=
,%=
,+=
,-=
,>>=
,<<=
,&=
,^=
,|=
-
throw
-
,
(अल्पविराम ऑपरेटर)
असाइनमेंट, कंपाउंड असाइनमेंट और टर्नरी कंडीशनल ऑपरेटर्स राइट-एसोसिएटिव हैं। अन्य सभी बाइनरी ऑपरेटर बाएं-सहयोगी हैं।
टर्नेरी सशर्त ऑपरेटर के नियम सरल पूर्वता के नियमों की तुलना में थोड़ा अधिक जटिल हो सकते हैं।
- एक ऑपरेंड एक को कम कसकर बांधता है
?
किसी भी अन्य ऑपरेटर की तुलना में इसके बायीं ओर:
a। प्रभावी रूप से, सशर्त ऑपरेटर के दूसरे ऑपरेंड को पार्स किया जाता है जैसे कि यह कोष्ठक होता है। यह एक अभिव्यक्ति की अनुमति देता है जैसेa ? b , c : d
को वाक्यविन्यास रूप से मान्य होना चाहिए। - एक ऑपरैंड अधिक कसकर बांधता है a
?
असाइनमेंट ऑपरेटर की तुलना में इसके दाईं ओर या इसके बाईं ओरthrow
, तोa = b ? c : d
a = (b ? c : d)
बराबर है औरthrow a ? b : c
,throw (a ? b : c)
बराबर है। - एक ऑपरेंड एक असाइनमेंट ऑपरेटर को अपने अधिकार पर अधिक कसकर बांधता है
:
इसके बाईं ओर, इसलिएa ? b : c = d
एक के बराबरa ? b : (c = d)
।
अंकगणितीय आपरेटर
C ++ में अंकगणितीय संचालकों की वैसी ही मिसाल है जैसी वे गणित में करते हैं:
गुणन और विभाजन ने सहानुभूति छोड़ दी है (जिसका अर्थ है कि उन्हें बाएं से दाएं मूल्यांकन किया जाएगा) और उनके पास जोड़ और घटाव की तुलना में अधिक पूर्वता है, जो कि सहक्रियाशीलता भी छोड़ चुके हैं।
हम कोष्ठक (
)
का उपयोग करके अभिव्यक्ति की पूर्वता को भी बाध्य कर सकते हैं। ठीक उसी तरह जैसे आप सामान्य गणित में करते हैं।
// volume of a spherical shell = 4 pi R^3 - 4 pi r^3
double vol = 4.0*pi*R*R*R/3.0 - 4.0*pi*r*r*r/3.0;
//Addition:
int a = 2+4/2; // equal to: 2+(4/2) result: 4
int b = (3+3)/2; // equal to: (3+3)/2 result: 3
//With Multiplication
int c = 3+4/2*6; // equal to: 3+((4/2)*6) result: 15
int d = 3*(3+6)/9; // equal to: (3*(3+6))/9 result: 3
//Division and Modulo
int g = 3-3%1; // equal to: 3 % 1 = 0 3 - 0 = 3
int h = 3-(3%1); // equal to: 3 % 1 = 0 3 - 0 = 3
int i = 3-3/1%3; // equal to: 3 / 1 = 3 3 % 3 = 0 3 - 0 = 3
int l = 3-(3/1)%3; // equal to: 3 / 1 = 3 3 % 3 = 0 3 - 0 = 3
int m = 3-(3/(1%3)); // equal to: 1 % 3 = 1 3 / 1 = 3 3 - 3 = 0
तार्किक और OR ऑपरेटर
इन संचालकों की C ++: और OR से पहले की सामान्य मिसाल है।
// You can drive with a foreign license for up to 60 days
bool can_drive = has_domestic_license || has_foreign_license && num_days <= 60;
यह कोड निम्नलिखित के बराबर है:
// You can drive with a foreign license for up to 60 days
bool can_drive = has_domestic_license || (has_foreign_license && num_days <= 60);
कोष्ठक जोड़ने से व्यवहार नहीं बदलता है, हालांकि, यह पढ़ने में आसान बनाता है। इन कोष्ठकों को जोड़कर, लेखक की मंशा के बारे में कोई भ्रम नहीं है।
तार्किक और & || ऑपरेटर: शॉर्ट-सर्किट
&& ने पूर्ववर्तीता को खत्म कर दिया है, इसका मतलब यह है कि एक साथ मूल्यांकन करने के लिए कोष्ठक रखे जाते हैं।
c ++ में शॉर्ट सर्किट मूल्यांकन का उपयोग && और || अनावश्यक निष्पादन नहीं करना।
यदि बायां हाथ || सही है कि सही हाथ पक्ष अब मूल्यांकन की जरूरत नहीं है।
#include <iostream>
#include <string>
using namespace std;
bool True(string id){
cout << "True" << id << endl;
return true;
}
bool False(string id){
cout << "False" << id << endl;
return false;
}
int main(){
bool result;
//let's evaluate 3 booleans with || and && to illustrate operator precedence
//precedence does not mean that && will be evaluated first but rather where
//parentheses would be added
//example 1
result =
False("A") || False("B") && False("C");
// eq. False("A") || (False("B") && False("C"))
//FalseA
//FalseB
//"Short-circuit evaluation skip of C"
//A is false so we have to evaluate the right of ||,
//B being false we do not have to evaluate C to know that the result is false
result =
True("A") || False("B") && False("C");
// eq. True("A") || (False("B") && False("C"))
cout << result << " :=====================" << endl;
//TrueA
//"Short-circuit evaluation skip of B"
//"Short-circuit evaluation skip of C"
//A is true so we do not have to evaluate
// the right of || to know that the result is true
//If || had precedence over && the equivalent evaluation would be:
// (True("A") || False("B")) && False("C")
//What would print
//TrueA
//"Short-circuit evaluation skip of B"
//FalseC
//Because the parentheses are placed differently
//the parts that get evaluated are differently
//which makes that the end result in this case would be False because C is false
}
यूनरी ऑपरेटर्स
यूनिरी संचालक उस वस्तु पर कार्य करते हैं जिस पर उन्हें बुलाया जाता है और उच्च प्राथमिकता होती है। (रिमार्क्स देखें)
जब उपसर्ग का उपयोग किया जाता है, तो कार्रवाई पूरे ऑपरेशन के मूल्यांकन के बाद ही होती है, जिससे कुछ दिलचस्प अंकगणित होते हैं:
int a = 1;
++a; // result: 2
a--; // result: 1
int minusa=-a; // result: -1
bool b = true;
!b; // result: true
a=4;
int c = a++/2; // equal to: (a==4) 4 / 2 result: 2 ('a' incremented postfix)
cout << a << endl; // prints 5!
int d = ++a/2; // equal to: (a+1) == 6 / 2 result: 3
int arr[4] = {1,2,3,4};
int *ptr1 = &arr[0]; // points to arr[0] which is 1
int *ptr2 = ptr1++; // ptr2 points to arr[0] which is still 1; ptr1 incremented
std::cout << *ptr1++ << std::endl; // prints 2
int e = arr[0]++; // receives the value of arr[0] before it is incremented
std::cout << e << std::endl; // prints 1
std::cout << *ptr2 << std::endl; // prints arr[0] which is now 2