क्या "लंबी लंबी" = "लंबी लंबी int" = "लंबी int लंबी" = "int long long"?


153

मैंने दोनों पाया long int longऔर int long longएक चर प्रकार के लिए संकलन कर सकता हूं । वहाँ के बीच कोई अंतर है long int long, int long long, long longऔर long long int?

सामान्य तौर पर, क्या प्रकार समान है यदि इसकी संख्या समान है long?

1 लंबा:

long l;
int long il;
long int li;

2 लंबा:

long long ll;
int long long ill;
long int long lil;
long long int lli;

इसके अलावा अगर ऊपर सही है, तो निम्नलिखित घोषणाएं भी समान हैं?

long long* llp;
int long long* illp;
long int long* lilp;
long long int* llip;

8
इसका उपयोग करके परीक्षण करें (केवल अपने कंपाइलर पर) std::swap। यह संकलित नहीं करेगा यदि प्रकार समान नहीं हैं।
बाथशीबा


24
फिर से खोलने के लिए वोट दिया। कथित डुप्लिकेट संबंधित है लेकिन यह प्रश्न नहीं है। इस सवाल का जवाब वहाँ पर नहीं है। करीबी मतदाता: कृपया अज्ञानता के आधार पर बंद मत करें।
चीयर्स एंड हीथ। - अल्फ


प्रत्येक आकार () की तुलना सुनिश्चित करें। एक लंबा लंबा 64 बिट होना चाहिए इसलिए आकार (एल) 8 होना चाहिए, यदि आकार (बीमार) == आकार (उधार) तो आपका संकलक उन्हें समान देखता है। यह आपके वर्तमान संकलक और भविष्य के किसी भी संकलक के लिए सही होगा, जिसका आप सामना कर सकते हैं (आकार-प्रकार के निधन तक) - (जो कि उम्मीद है कि कभी नहीं होगा या मुझे करने के लिए पुनर्लेखन की एक गंभीर राशि मिली है)।
माइकल स्टिम्सन

जवाबों:


136

सी ++ मानक के अनुसार (7.1.6.2 सरल प्रकार विनिर्देशक)

3 जब कई सरल-प्रकार-विनिर्देशक की अनुमति दी जाती है, तो उन्हें किसी भी क्रम में अन्य घोषित-विनिर्देशकों के साथ स्वतंत्र रूप से जोड़ा जा सकता है।

इसलिए उदाहरण के लिए निम्नलिखित घोषणा मान्य है

long static long const int x = 10;

आप क्वालीफायर constexprके साथ constस्पेसिफिक का भी उपयोग कर सकते हैं । उदाहरण के लिए

constexpr long static long const int x = 10;

वैसे, हम स्पेसियर के बारे में भूल गए signed! इसे घोषणाकर्ता से पहले उदाहरण के लिए जोड़ते हैंx

constexpr long static long const int signed x = 10;

सी में आप एक ही घोषित स्पेसियर अनुक्रम में कई प्रकार के क्वालीफायर का उपयोग कर सकते हैं। सी स्टैंडर्ड के अनुसार (6.7.3 प्रकार के क्वालिफायर)

5 यदि एक ही क्वालीफायर एक ही निर्दिष्ट-क्वालिफायर-सूची में एक से अधिक बार दिखाई देता है, या तो सीधे या एक या एक से अधिक टाइपराइफ्स के माध्यम से, व्यवहार वैसा ही होता है जैसे कि वह केवल एक बार ही दिखाई देता है।

इसलिए C में उदाहरण के लिए निम्नलिखित घोषणा भी मान्य है

const long const long static const int const signed x = 10;

इसलिए यदि आपको कार्यक्रम में टाइप किए गए प्रतीकों की संख्या के अनुसार भुगतान किया जाता है, तो मैं आपको ऐसी घोषणाओं का उपयोग करने की सलाह देता हूं। :)


96
जब आप पूरी तरह से, सकारात्मक रूप से सुनिश्चित हो जाते हैं कि मूल्य कभी नहीं बदलेगा।
बॉब

3
@hvd दुर्भाग्य से आमतौर पर टिप्पणियों को इस तरह की गणना से बाहर रखा गया है।
मास्को

9
यहां तक ​​कि अगर लिखा है #define REM(...), और फिर एक विशाल शब्द गणना के उदाहरण के लिए i++; REM(Here, we increment i to make sure the new value of i is one more than the old value of i. This is safe because we know the value of i is less than the maximum value of i's type.),?


15
आपको क्वालिफ़ायर को इंटरमिक्स करने की भी ज़रूरत नहीं है ... const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const answer = 42;सिर्फ सी में ठीक संकलित करता है :-)
लुकास ट्रेजेनिव्स्की

111

क्या प्रकार समान है ...

हाँ।

C ++ 11 §7.1.6.2 / 3

" जब कई सरल-प्रकार-विनिर्देशक एस की अनुमति दी जाती है, तो उन्हें किसी भी क्रम में अन्य घोषित-निर्दिष्टकर्ताओं के साथ स्वतंत्र रूप से जोड़ा जा सकता है ।


2
सीधा निशानेबाज़। +1।
einpoklum

42

हाँ, लेकिन कृपया नहीं । जिस तरह अंग्रेजी और जर्मन में विशेषण और क्रिया विशेषणों के लिए पारंपरिक शब्द आदेश हैं (उदाहरण के लिए समय - स्थान), इसलिए C और C ++ करें। पारंपरिक क्रम से भिन्न करना कंपाइलर को भ्रमित नहीं करेगा, लेकिन यह आपके साथी डेवलपर्स को भ्रमित करेगा। मेरा सुझाव है कि पारंपरिक आदेश की तर्ज पर मोटे तौर पर है

  1. static/ extern(लिंकेज)
  2. const/ volatile(संशोधन)
  3. signed/ unsigned(हस्ताक्षर)
  4. short/ long(लंबाई)
  5. मूल प्रकार (सिर संज्ञा)

हालांकि वहाँ निश्चित रूप से कुछ wiggle कमरा है।


29

क्या "लंबी लंबी" = "लंबी लंबी int" = "लंबी int लंबी" = "int long long"?

यहां अन्य सभी उत्तरों ने आपके प्रश्न के दूसरे भाग के बारे में बात की। पहले भाग के लिए: "लंबी लंबी" = "लंबी लंबी int" है? , जवाब हां है

C ++ 11 7.1.6.2 सरल प्रकार निर्दिष्टकर्ता (तालिका 10)

Specifier(s)            Type
...                     ...
long long int           long long int
long long               long long int
long int                long int
long                    long int  
...                     ...  

आपके प्रश्न के दूसरे भाग के लिए: "लंबे समय तक लंबे" = "लंबे समय तक लंबे"? , जवाब फिर से हाँ है।

प्रकार-विनिर्देशक किसी भी क्रम में हो सकते हैं और अन्य घोषणा विनिर्देशकों के साथ परस्पर क्रिया की जा सकती है । इसलिए, निम्नलिखित में से सभी

long long  
long long int  
long int long  
int long long  

मान्य और समकक्ष हैं।


3
मुझे यह नहीं मिल रहा है कि आप @ कैचर्स और hth में सुधार क्यों नहीं कर रहे हैं। - इसके बजाय अल्फ जवाब।
सेबेस्टियन मच

8
@phresnel; क्योंकि अन्य सभी उत्तर केवल आधे को कवर करते हैं। सभी ने फॉर्मेट के इंटरमिक्सिंग के बारे में बताया जो शीर्षक में प्रश्न के पहले भाग को याद कर रहा है: क्या "लॉन्ग लॉन्ग" = "लॉन्ग इंट इंट" = "लॉन्ग इंट लॉन्ग" = "इंट लॉन्ग लॉन्ग"?
haccks

5
@phresnel कुछ लोग प्रतिनिधि के प्रोत्साहन के लिए उत्तर देते हैं। किसी दूसरे के उत्तर को संपादित करने के लिए दूसरे आधे उत्तर को कवर करना किसी और को प्रभावी रूप से क्रेडिट देने के लिए बहुत काम है।

1
सच। सबसे पहले यह सिर्फ एक मामूली जोड़ के रूप में दिखाई दिया। (CC: @ Thebluefish)
सेबस्टियन मच
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.