एकाधिक वर्णों पर उपयोग किए जाने पर C ++ में एकल उद्धरण क्या करते हैं?


279

मैं इस कोड के बारे में उत्सुक हूं:

cout << 'test'; // Note the single quotes.

मुझे का एक आउटपुट देता है 1952805748

मेरा प्रश्न: आउटपुट मेमोरी या कुछ और में एक पता है?


10
वेतन ध्यान है कि वास्तविक मूल्य कार्यान्वयन है परिभाषित stackoverflow.com/questions/3960954/c-multicharacter-literal
FireAphis

जवाबों:


283

यह एक बहु-चरित्र शाब्दिक है। 1952805748है 0x74657374, जो के रूप में विघटित होता है

0x74 -> 't'
0x65 -> 'e'
0x73 -> 's'
0x74 -> 't'

संपादित करें:

सी ++ मानक, ++2.14.3 / 1 - चरित्र शाब्दिक

(...) एक साधारण वर्ण शाब्दिक जिसमें एक से अधिक सी-चार होते हैं, एक मल्टीचैकर शाब्दिक है। एक मल्टीचैकर शाब्दिक प्रकार इंट और कार्यान्वयन-डे। नेड मूल्य है।


11
आपने यह उल्लेख नहीं किया कि यह कार्यान्वयन है।
थॉमस बोनीनी

2
मुझे लगता है कि परिभाषा के बारे में सबसे मजेदार बात यह है कि sizeof(int)कार्यान्वयन को भी परिभाषित किया गया है। इसलिए न केवल भंडारण आदेश कार्यान्वयन को परिभाषित किया गया है, बल्कि इनमें से अधिकतम लंबाई भी है।
बोब्बोबो

74

नहीं, यह कोई पता नहीं है। यह तथाकथित मल्टीबैट चरित्र है।

आमतौर पर, यह संयुक्त रूप से चार वर्णों का ASCII मान है।

't' == 0x74; 'e' == 0x65; 's' == 0x73; 't' == 0x74; 

तो 0x74657374 1952805748 है।

लेकिन यह किसी अन्य कंपाइलर पर 0x74736574 भी हो सकता है। C और C ++ मानकों दोनों का कहना है कि मल्टीबाइट वर्णों का मूल्य कार्यान्वयन है । इसलिए आम तौर पर इसका उपयोग दृढ़ता से हतोत्साहित किया जाता है।


क्या ऐसे मल्टी-बाइट चरित्र की लंबाई 4 बाइट्स के लिए विवश है? यानी यह पात्रों के रूप में लिखे गए एक इंट का प्रतिनिधित्व करता है?
जियोर्जियो

2
@ जियोर्जियो: मानक केवल यह कहते हैं कि यह कार्यान्वयन को परिभाषित करता है, जिसमें अधिक विवरण नहीं है। व्यवहार में, चूंकि intअधिकांश मशीनों पर 4 बाइट्स हैं, मुझे नहीं लगता कि यह 4 बाइट्स से अधिक का उपयोग करने के लिए समझ में आता है। हां, कुछ स्थिरांक लिखने का यह एक सुविधाजनक तरीका था, लेकिन दुर्भाग्य से अलग-अलग संकलक इसे अलग तरह से व्याख्या कर रहे हैं, इसलिए आजकल अधिकांश कोडिंग शैली इसके उपयोग को हतोत्साहित करती हैं।
chys

2
@chys: और यह तथ्य कि यह कार्यान्वयन-परिभाषित है इसका मतलब यह है कि इसे लगातार होना भी आवश्यक नहीं है। एक अनुरूप संकलक सभी मल्टीचैकर शाब्दिकों को मान 0 दे सकता है, उदाहरण के लिए (हालांकि यह अमित्र होगा)।
कीथ थॉम्पसन

2
किसी से पूछना होगा कि मानक में यह सुविधा क्यों मौजूद है। ऐसा लगता है कि इस तरह के एक दुर्लभ उपयोग के मामले, वैसे भी कार्यान्वयन परिभाषित किया गया है, और यदि आवश्यक हो तो साधारण बिट शिफ्टिंग और ऑर्निग के साथ काफी स्पष्ट रूप से किया जा सकता है।
२३'१३

1
@ बॉन हां , मेरी संवेदनाएं बिल्कुल। लेकिन आप इसे सुरक्षित रूप से स्विच और ==
व्हाट्सएप

18

एक साधारण चरित्र शाब्दिक जिसमें एक से अधिक सी-चार होते हैं, एक मल्टीचैकर शाब्दिक होता है। एक मल्टीचैकर शाब्दिक प्रकार इंट और कार्यान्वयन-डे। नेड मूल्य है।

कार्यान्वयन द्वारा परिभाषित परिभाषित व्यवहार को लागू करने की आवश्यकता है। उदाहरण के लिए जीसीसी में आप इसे यहां पा सकते हैं

संकलक एक बार में एक बहु-चरित्र चरित्र को एक चरित्र को महत्व देता है, प्रति लक्षित चरित्र की बिट्स की संख्या द्वारा छोड़े गए पिछले मान को शिफ्ट कर रहा है, और फिर नए वर्ण के बिट-पैटर्न में लक्ष्य के चौड़ाई में काट दिया गया चरित्र। अंतिम बिट-पैटर्न को इंट इंट दिया गया है, और इसलिए इस पर हस्ताक्षर किए गए हैं, चाहे एकल वर्ण हस्ताक्षरित हैं या नहीं।

अधिक विवरण के लिए इस पृष्ठ में स्पष्टीकरण की जाँच करें


10

वे वास्तव में सिर्फ intएस। वे कोर ऑडियो एपीआई एनम के उदाहरण के लिए, CoreAudioTypes.hहेडर फ़ाइल में बड़े पैमाने पर उपयोग किए जाते हैं ,

enum
{
    kAudioFormatLinearPCM               = 'lpcm',
    kAudioFormatAC3                     = 'ac-3',
    kAudioFormat60958AC3                = 'cac3',
    kAudioFormatAppleIMA4               = 'ima4',
    kAudioFormatMPEG4AAC                = 'aac ',
    kAudioFormatMPEG4CELP               = 'celp',
} ;

"प्लेटफ़ॉर्म स्वतंत्र" नहीं होने के बारे में बहुत सारी बकवास है, लेकिन जब आप एक एपीआई का उपयोग कर रहे हैं जो एक विशिष्ट प्लेटफ़ॉर्म के लिए बनाया गया है, जो पोर्टेबिलिटी के बारे में परवाह करता है। एक ही मंच पर समानता के लिए जाँच कभी विफल नहीं होगी। इन enumमूल्यों को पढ़ना आसान है और वे वास्तव में अपने मूल्य में अपनी पहचान रखते हैं , जो बहुत अच्छा है।

नीचे मैंने जो करने की कोशिश की है वह एक मल्टीबाइट कैरेक्टर शाब्दिक है, इसलिए इसे प्रिंट किया जा सकता है (मैक पर यह काम करता है)। अजीब बात है, यदि आप सभी 4 वर्णों का उपयोग नहीं करते हैं, तो परिणाम नीचे गलत हो जाता है।

#include <stdio.h>

#define MASK(x,BYTEX) ((x&(0xff<<8*BYTEX))>>(8*BYTEX))

struct Multibyte
{
  union{
    int val ;
    char vals[4];
  };

  Multibyte() : val(0) { }
  Multibyte( int in )
  {
    vals[0] = MASK(in,3);
    vals[1] = MASK(in,2);
    vals[2] = MASK(in,1);
    vals[3] = MASK(in,0);
  }
  char operator[]( int i ) {
    return val >> (3-i)*8 ; // works on mac
    //return val>>i*8 ; // might work on other systems
  }

  void println()
  {
    for( int i = 0 ; i < 4 ; i++ )
      putc( vals[i], stdout ) ;
    puts( "" ) ;
  }
} ;

int main(int argc, const char * argv[])
{
  Multibyte( 'abcd' ).println() ;  
  Multibyte( 'x097' ).println() ;
  Multibyte( '\"\\\'\'' ).println() ;
  Multibyte( '/*|' ).println() ;
  Multibyte( 'd' ).println() ;

  return 0;
}

6
"एक ही मंच पर समानता के लिए जाँच कभी विफल नहीं होगी।" ये हो सकता है। Visual Studio xyz पर अपग्रेड करें और अपनी जीभ काटें। इस लाइब्रेरी ने एक भयानक निर्णय लिया है।
ऑर्बिट

@LightnessRacesinOrbit "विज़ुअल स्टूडियो xyz में अपग्रेड करें और अपनी जीभ काटें ।" कोर ऑडियो एपीआई ओएस एक्स का सिस्टम ऑडियो एपीआई है इसलिए यह प्रासंगिक नहीं है।
जीन-माइकेल सेलेरियर

5
@ जीन-माइकेलकेयरियर: ठीक; अपने OSX क्लैंग संस्करण को अपग्रेड करें और अपनी जीभ
काटें

1

इस तरह की सुविधा वास्तव में अच्छी है जब आप पार्सर का निर्माण कर रहे हैं। इस पर विचार करो:

byte* buffer = ...;
if(*(int*)buffer == 'GET ')
  invoke_get_method(buffer+4);

यह कोड संभवतया केवल विशिष्ट एंडियन पर काम करेगा और विभिन्न कंपाइलरों को तोड़ सकता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.