c++ - अल्पविराम ऑपरेटर का उचित उपयोग क्या है?




coding-style comma-operator (6)

ऑपरेटर () के कुछ व्यावहारिक उपयोग प्रतीत होते हैं।

ब्रजेन स्ट्रॉस्ट्रुप, द डिजाइन एंड एवोल्यूशन ऑफ सी ++

अल्पविराम के अधिकांश उपयोग को विकिपीडिया लेख Comma_operator#Uses में पाया जा सकता है।

boost::assign का उपयोग करते समय मैंने पाया एक दिलचस्प उपयोग boost::assign , जहां यह विवेकपूर्ण तरीके से ऑपरेटर को ओवरलोड किया गया था ताकि इसे अल्पविराम से अलग किए गए मानों की सूची के रूप में व्यवहार किया जा सके जो एक वेक्टर ऑब्जेक्ट के अंत में धकेल दिया जा सकता है

#include <boost/assign/std/vector.hpp> // for 'operator+=()'
using namespace std;
using namespace boost::assign; // bring 'operator+=()' into scope

{
    vector<int> values;  
    values += 1,2,3,4,5,6,7,8,9; // insert values at the end of the container
}

दुर्भाग्य से, उपरोक्त उपयोग जो कि प्रोटोटाइप के लिए लोकप्रिय था, अब यूनिफॉर्म इनिशियलाइज़ेशन का समर्थन करने वाले कंपाइलर्स शुरू होने के बाद पुरातन दिखेंगे

ताकि हमें वापस छोड़ दिया जाए

ऑपरेटर () के कुछ व्यावहारिक उपयोग प्रतीत होते हैं।

ब्रजेन स्ट्रॉस्ट्रुप, द डिजाइन एंड एवोल्यूशन ऑफ सी ++

मैंने यह कोड देखा:

if (cond) {
    perror("an error occurred"), exit(1);
}

तुम ऐसा क्यों करोगे? सिर्फ क्यों नहीं:

if (cond) {
    perror("an error occurred");
    exit(1);
}

अल्पविराम ऑपरेटर अभिव्यक्ति की समूहीकरण की अनुमति देता है जहां एक की उम्मीद है।

उदाहरण के लिए यह किसी मामले में उपयोगी हो सकता है:

// In a loop
while ( a--, a < d ) ...

लेकिन आपके मामले में इसका उपयोग करने का कोई कारण नहीं है। यह भ्रामक होगा ... यह बात है ...

आपके मामले में, यह केवल घुंघराले ब्रेस से बचने के लिए है:

if(cond)
    perror("an error occurred"), exit(1);

// =>
if (cond)
{
    perror("an error occurred");
    exit(1);
}

अल्पविराम ऑपरेटर प्रलेखन के लिए एक लिंक।


अल्पविराम ऑपरेटर के वैध मामले दुर्लभ हैं, लेकिन वे मौजूद हैं। एक उदाहरण है जब आप सशर्त मूल्यांकन के अंदर कुछ होना चाहते हैं। उदाहरण के लिए:

std::wstring example;
auto it = example.begin();
while (it = std::find(it, example.end(), L'\\'), it != example.end())
{
    // Do something to each backslash in `example`
}

इसका उपयोग उन स्थानों पर भी किया जा सकता है जहां आप केवल एक ही अभिव्यक्ति रख सकते हैं, लेकिन दो चीजें घटित करना चाहते हैं। उदाहरण के लिए, लूप के तीसरे घटक के लिए निम्नलिखित लूप वेतन वृद्धि x और घटाव y है:

int x = 0;
int y = some_number;
for(; x < y; ++x, --y)
{
    // Do something which uses a converging x and y
}

इसके उपयोग की तलाश में मत जाओ, लेकिन अगर यह उचित है, तो इसका उपयोग करने से डरो मत, और यदि आप किसी अन्य व्यक्ति को इसका उपयोग करते हुए देखते हैं, तो इसे एक लूप के लिए नहीं फेंकना चाहिए। यदि आपके पास दो चीजें हैं जिनके अलग-अलग बयान नहीं होने का कोई कारण नहीं है, तो उन्हें अल्पविराम ऑपरेटर का उपयोग करने के बजाय अलग-अलग बयान दें।


आपके उदाहरण में यह बिना किसी कारण के कार्य करता है। जब यह लिखा जाता है तो यह उपयोगी होता है

if(cond)
  perror("an error occured"), exit(1) ;

- तो आप घुंघराले ब्रेस की जरूरत नहीं है । लेकिन यह आपदा को निमंत्रण है।

अल्पविराम ऑपरेटर को दो या अधिक अभिव्यक्तियों को एक ऐसी स्थिति में रखना है जहाँ संदर्भ केवल एक की अनुमति देता है। आपके मामले में, इसका उपयोग करने की कोई आवश्यकता नहीं है; अन्य मामलों में, जैसे कि थोड़ी देर के लूप में, यह उपयोगी हो सकता है:

while (a = b, c < d)
  ...

जहां लूप का वास्तविक "मूल्यांकन" अंतिम अभिव्यक्ति पर पूरी तरह से संचालित होता है।


इस प्रकार के सिंटैक्स को प्राप्त करने के लिए boost::assign किए गए अल्पविराम ऑपरेटर को अत्यधिक भारित करता है:

vector<int> v; 
v += 1,2,3,4,5,6,7,8,9;

इसे कुछ उदाहरणों से समझा जा सकता है:

पहला: एक अभिव्यक्ति पर विचार करें:

   x = ++j;

लेकिन कुछ समय के लिए, यदि हमें अस्थायी रूप से डिबग मान निर्दिष्ट करने की आवश्यकता है, तो हम लिख सकते हैं।

   x = DEBUG_VALUE, ++j; 

दूसरा:
कोमा , ऑपरेटरों को अक्सर for() उपयोग किया जाता है for() जैसे for() :

for(i = 0, j = 10; i < N; j--, i++) 
 //      ^                   ^     here we can't use ;  

तीसरा:
एक और उदाहरण (वास्तव में यह दिलचस्प लग सकता है):

if (x = 16 / 4), if remainder is zero then print  x = x - 1;  
if (x = 16 / 5), if remainder is zero then print  x = x + 1;

यह एक एकल चरण में भी किया जा सकता है;

  if(x = n / d, n % d) // == x = n / d; if(n % d)
    printf("Remainder not zero, x + 1 = %d", (x + 1));
  else
    printf("Remainder is zero,  x - 1 = %d", (x - 1));

पुनश्च: यह जानना भी दिलचस्प हो सकता है कि कभी-कभी यह उपयोग करने के लिए विनाशकारी होता है , ऑपरेटर। उदाहरण के लिए , स्ट्राटोक उपयोग में, कोड काम नहीं कर रहा है , गलती से, ओपी फ़ंक्शन का नाम लिखना भूल गया और tokens = strtok(NULL, ",'"); लिखने के बजाय tokens = strtok(NULL, ",'"); , उन्होंने tokens = (NULL, ",'"); लिखा tokens = (NULL, ",'"); और उसे संकलन त्रुटि नहीं मिल रही थी - लेकिन इसकी एक वैध अभिव्यक्ति है कि tokens = ",'"; उनके कार्यक्रम में एक अनन्त लूप का कारण बना।







comma-operator