একাধিক অক্ষর ব্যবহার করার সময় সি ++ এ একক উদ্ধৃতিগুলি কী করবে?


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'

সম্পাদনা:

সি ++ স্ট্যান্ডার্ড, .12.14.3 / 1 - অক্ষর আক্ষরিক

(...) একটি সাধারণ চরিত্রের আক্ষরিক যা একাধিক সি-চর ধারণ করে এটি একটি মাল্টিচ্যারেক্টর আক্ষরিক। একটি মাল্টিচার্যাক্টর আক্ষরিকের টাইপ ইন্ট এবং প্রয়োগকরণ-ডি-নেড হয় has


11
আপনি উল্লেখ করেননি যে এটি বাস্তবায়ন সংজ্ঞায়িত।
থমাস বনিনি

2
আমি মনে করি যে সংজ্ঞাটি সম্পর্কে মজাদার জিনিসটি sizeof(int)হ'ল বাস্তবায়নও সংজ্ঞায়িত। সুতরাং কেবল স্টোরেজ অর্ডার বাস্তবায়নই সংজ্ঞায়িত করা হয় না, তবে এর সর্বোচ্চ দৈর্ঘ্যটিও।
bobobobo

74

না, এটি কোনও ঠিকানা নয়। এটি তথাকথিত মাল্টিবাইট চরিত্র।

সাধারণত, এটি সংযুক্ত চারটি অক্ষরের ASCII মান।

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

সুতরাং 0x74657374 1952805748 হয়।

তবে এটি অন্য কয়েকটি সংকলকটিতে 0x74736574ও হতে পারে। সি এবং সি ++ স্ট্যান্ডার্ড উভয়ই বলে যে মাল্টিবাইট অক্ষরের মান বাস্তবায়ন সংজ্ঞায়িত । সুতরাং সাধারণত এর ব্যবহার দৃ strongly ়ভাবে নিরুৎসাহিত করা হয়।


এই জাতীয় বহু-বাইট চরিত্রের দৈর্ঘ্য কি 4 বাইটের মধ্যে সীমাবদ্ধ? অর্থাত্ এটি কী চরিত্র হিসাবে লিখিত একটি অন্তর্ভুক্ত প্রতিনিধিত্ব করে?
জর্জিও

2
@ জর্জিও: স্ট্যান্ডার্ডটি বলেছে এর বাস্তবায়ন সংজ্ঞায়িত করা হয়েছে, এর সাথে আরও কোনও বিবরণ নেই। অনুশীলনে, যেহেতু intবেশিরভাগ মেশিনে 4 বাইট হয়, তাই 4 বাইটের বেশি ব্যবহার করা বোধগম্য বলে আমি মনে করি না। হ্যাঁ, এটি কিছু ধ্রুবক লেখার সুবিধাজনক উপায় হওয়ার উদ্দেশ্য ছিল, তবে দুর্ভাগ্যক্রমে বিভিন্ন সংকলকগুলি এটির ভিন্ন ব্যাখ্যা করে চলেছে, তাই আজকাল বেশিরভাগ কোডিং শৈলীগুলি এর ব্যবহারকে নিরুৎসাহিত করে।
ছাই

2
@ সিচস: এবং বাস্তবায়ন সংজ্ঞায়িত হওয়ার অর্থ এটির সাথে সামঞ্জস্যপূর্ণ হওয়ারও প্রয়োজন নেই। একটি অনুসারে সংকলক সমস্ত মাল্টিচার্যাক্টর আক্ষরিক মান 0 দিতে পারে, উদাহরণস্বরূপ (যদিও এটি বন্ধুত্বপূর্ণ হবে)।
কিথ থম্পসন

2
একজনকে জিজ্ঞাসা করতে হবে যে এই একক বৈশিষ্ট্যটি কেন স্ট্যান্ডার্ডে বিদ্যমান। দেখে মনে হচ্ছে এটি বিরল ব্যবহারের ক্ষেত্রে, বাস্তবায়নের জন্য যে কোনও উপায়ে সংজ্ঞায়িত করা হয়েছে এবং সাধারণ বিট শিফটিং এবং প্রয়োজনে or'ing দিয়ে বেশ পরিষ্কারভাবে করা যেতে পারে।
বোয়ান

1
@ বুন হ্যাঁ , আমার অনুভূতিগুলি ঠিক। তবে আপনি এটি নিরাপদে সুইচ এবং ==
নোট নোটে

18

একটি সাধারণ চরিত্রের আক্ষরিক যা একাধিক সি-চর ধারণ করে তা হ'ল বহুচরাক্ষর আক্ষরিক। একটি মাল্টিচার্যাক্টর আক্ষরিকের টাইপ ইন্ট এবং প্রয়োগকরণ-ডি-নেড হয় has

বাস্তবায়ন সংজ্ঞায়িত আচরণ বাস্তবায়নের মাধ্যমে নথিভুক্ত করা প্রয়োজন। উদাহরণস্বরূপ জিসিসিতে আপনি এটি এখানে খুঁজে পেতে পারেন

সংকলকটি একবারে বহু অক্ষরযুক্ত অক্ষরকে একটি অক্ষরকে স্থির করে, টার্গেটের অক্ষর অনুসারে বিটের সংখ্যার দ্বারা পূর্বের মানটি স্থানান্তর করে এবং তারপরে অথবা নতুন অক্ষরের বিট-প্যাটার্নে লক্ষ্যের প্রস্থে ছিন্ন হয়ে থাকে অক্ষর। চূড়ান্ত বিট-প্যাটার্নটি টাইপ ইন্টি দেওয়া হয় এবং একক অক্ষর স্বাক্ষরিত হয় বা না তা বিবেচনা না করে স্বাক্ষরিত হয়।

আরও তথ্যের জন্য এই পৃষ্ঠায় ব্যাখ্যা চেক করুন


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
"একই প্ল্যাটফর্মে সমতার জন্য চেকিং কখনই ব্যর্থ হবে না।" এটা হতে পারে. ভিজ্যুয়াল স্টুডিও xyz এ আপগ্রেড করুন এবং আপনার জিহ্বাকে কামড় দিন। এই গ্রন্থাগারটি এক ভয়ানক সিদ্ধান্ত নিয়েছে।
লাইটনেস রেস

@ লাইটনেসেসেসিনআরবিট "ভিজ্যুয়াল স্টুডিও xyz এ আপগ্রেড করুন এবং আপনার জিহ্বাকে কামড় দিন" " কোর অডিও এপিআই হ'ল ওএস এক্স এর সিস্টেম অডিও এপিআই তাই এটি প্রাসঙ্গিক নয়।
জিন-মিশেল সেলারিয়ার

5
@ জিন-মাইচেলসিলিয়ার: ফাইন; আপনার ওএসএক্স ক্ল্যাং সংস্করণটি আপগ্রেড করুন এবং আপনার জিহ্বাকে কামড় দিন ...
লাইটনেস রেস

1

আপনি যখন পার্সার তৈরি করছেন তখন এই জাতীয় বৈশিষ্ট্যটি সত্যিই ভাল। এই বিবেচনা:

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

এই কোডটি সম্ভবত নির্দিষ্ট নির্দিষ্টতা নিয়ে কাজ করবে এবং বিভিন্ন সংকলক জুড়ে ভেঙে যেতে পারে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.