দুটি স্ট্রিং আক্ষরিক সংঘবদ্ধ করুন


121

আমি কোয়েনিগ দ্বারা ত্বরণী সি ++ পড়ছি। তিনি লিখেছেন যে "নতুন ধারণাটি হ'ল আমরা একটি স্ট্রিং এবং একটি স্ট্রিং আক্ষরিক - বা এই ক্ষেত্রে দুটি স্ট্রিং (তবে দুটি স্ট্রিং লিটারাল নয়) যুক্ত করতে ব্যবহার করতে পারি।

ভাল, এই ধারণাটি বোঝার জন্য আমি মনে করি। এখন এটি আলোকিত করার জন্য দুটি পৃথক মহড়ার উপর onto

নিম্নলিখিত সংজ্ঞাগুলি কি বৈধ?

const string hello = "Hello";

const string message = hello + ",world" + "!";

এখন, আমি উপরেরটি কার্যকর করার চেষ্টা করেছি এবং এটি কার্যকর হয়েছে! তাই আমি খুশি ছিলাম।

তারপরে আমি পরের অনুশীলনটি করার চেষ্টা করেছি;

const string exclam = "!";

const string message = "Hello" + ",world" + exclam;

এটি কার্যকর হয়নি। এখন আমি বুঝতে পেরেছি এর সাথে আপনার কিছু সম্পর্ক আছে যে আপনি দুটি স্ট্রিং লিটারেল যুক্ত করতে পারবেন না, তবে আমি কেন কাজ করার প্রথম উদাহরণটি অর্জন করতে পেরেছি ("নয়", "বিশ্ব" এবং "এর মধ্যে অর্থগত পার্থক্য বুঝতে পারি না! "দুটি স্ট্রিং লিটারেল? এটি কি কাজ করা উচিত নয়?) তবে দ্বিতীয়টি নয়।


4
const string message = "Hello" ",world" + exclam(যেমন প্রথম বাদ দেওয়া +) জোরে কাজ ঠিক আছে।
n0rd

1
@ জো - "Hello" + ", world!"আপনি যখন করতে পারেন কেউ কেন লিখবে "Hello, world!"। যথারীতি সি ++ তে অনুভূত সমস্যাটির জন্য একটি দুর্দান্ত এবং সাধারণ কাজ রয়েছে। :-)
বো পারসন

2
@ বুও কেবলমাত্র আমিই ভাবতে পারি আপনি যদি একটি সংজ্ঞা (# ডেফাইন) ব্যবহার করেন
জো ফিলিপস

@ জো তারপরেও, আপনার লেখার সম্ভাবনা বেশি "Hello" ", world!"(ছাড়াই +)। সি ++ সম্পর্কে যে কেউ অভিযোগ করতে পারে তার অনেকগুলি অভিযোগ রয়েছে তবে আমি মনে করি না যে এটি এখানে পরিচালনা করা সেগুলির মধ্যে একটি। এটি ঠিক একই জিনিস যেমন আপনি লিখেছেন 1 / 3 + 1.5, এবং অভিযোগ করেছেন কারণ বিভাগটি অবিচ্ছেদ্য বিভাগ ছিল। আরও ভাল বা খারাপের জন্য, বেশিরভাগ ভাষাগুলি এইভাবে কাজ করে।
জেমস কানজে

2
@ পারসসন প্রকৃতপক্ষে এই বৈশিষ্ট্যটি "hello" " world" == "hello world"কার্যকর যদি আপনি একটি দীর্ঘ স্ট্রিং লিখতে চান এবং এটি আপনার উইন্ডোটির বাইরে যেতে না চান বা আপনি কিছু লাইন দৈর্ঘ্যের সংকীর্ণতার মধ্যে থাকতে চান। অথবা যদি কোনও স্ট্রিং ম্যাক্রোতে সংজ্ঞায়িত হয়।
দিমিতর স্লাভচেভ

উত্তর:


140
const string message = "Hello" + ",world" + exclam;

+অপারেটর বাম-থেকে-ডান করেছে associativity, তাই সমতুল্য আলাদা অভিব্যক্তি:

const string message = (("Hello" + ",world") + exclam);

আপনি দেখতে পাচ্ছেন, দুটি স্ট্রিং আক্ষরিক "Hello"এবং ",world"প্রথমে "যুক্ত", তাই ত্রুটি।

প্রথম দুটি স্ট্রিংগুলির মধ্যে একটিকে সঙ্কলিত হওয়া অবশ্যই একটি std::stringবস্তু হতে হবে :

const string message = string("Hello") + ",world" + exclam;

বিকল্পভাবে, আপনি +প্রথমে অভিব্যক্তির সেই অংশটি বন্ধুত্বের মাধ্যমে দ্বিতীয়টিকে মূল্যায়ন করতে বাধ্য করতে পারেন :

const string message = "Hello" + (",world" + exclam);

এটি অনুধাবন করে যে আপনার প্রথম উদাহরণ ( hello + ",world" + "!") কাজ করে কারণ std::string( hello) বাম দিকের যুক্তিগুলির মধ্যে একটি +। যে +মূল্যায়ন করা হয়, এর ফলে হয় std::stringযোগসূত্র স্ট্রিং সঙ্গে বস্তু, এবং যে ফলে std::stringতারপর ঘনিভূত হয় "!"


হিসাবে কেন আপনি কনক্যাটেনেট করতে পারবে না দুই স্ট্রিং লিটারেল ব্যবহার +, তার কারণ হল একটি স্ট্রিং আক্ষরিক শুধু অক্ষরের একটি অ্যারে (ক const char [N]যেখানে Nস্ট্রিং প্লাস এক দৈর্ঘ্য হল, নাল টারমিনেটর জন্য)। আপনি যখন বেশিরভাগ প্রসঙ্গে একটি অ্যারে ব্যবহার করেন, তখন এটিটিকে প্রাথমিক বিন্দুতে পয়েন্টারে রূপান্তরিত করা হয়।

সুতরাং, আপনি যখন চেষ্টা করার চেষ্টা করছেন তখন আপনি "Hello" + ",world"যা করতে চেষ্টা করছেন তা হ'ল দুটি const char*একসাথে যুক্ত করা, যা সম্ভব নয় (এটি দুটি পয়েন্টার একসাথে যুক্ত করার অর্থ কী?) এবং যদি এটি হয় তবে আপনি যা করেন না এটা করতে চেয়েছিলেন।


নোট করুন যে আপনি স্ট্রিং লিটারেলগুলিকে একে অপরের পাশে রেখে সংযুক্ত করতে পারেন ; উদাহরণস্বরূপ, নিম্নলিখিত দুটি সমতুল্য:

"Hello" ",world"
"Hello,world"

আপনার যদি দীর্ঘ স্ট্রিং আক্ষরিক থাকে যা আপনি একাধিক লাইনে বিভক্ত করতে চান তবে এটি কার্যকর। তাদের স্ট্রিং আক্ষরিক হতে হবে, যদিও: এটি const char*পয়েন্টার বা const char[N]অ্যারে দিয়ে কাজ করবে না ।


3
এছাড়াও, const string message = "Hello" + (",world"+exclam);স্পষ্টত প্রথম বন্ধনের কারণেও এটি কাজ করবে (এটি কি একটি শব্দ?)
চিন্ময় কাঁচি

1
আপনি যদি প্রথম উদাহরণটি কেন কাজ করে দেখান তবে আরও সম্পূর্ণ হতে পারে:const string message = ((hello + ",world") + "!");
মার্ক র্যানসোম

ধন্যবাদ! আমি সন্দেহ করেছিলাম এর বাম-থেকে-ডান সাহসিকতার সাথে কিছু করার আছে তবে নিশ্চিত ছিল না এবং এই শব্দার্থক পার্থক্যটি আমার কাছে খুব একটা বোঝায় না। আমি উত্তর প্রশংসা করি!
আর্থার কলি

2
আমি উল্লেখ করব যে "Hello" ",world"সিনট্যাক্সটি কেবল একাধিক লাইনে বিভক্ত হওয়ার জন্য নয় তবে যখন স্ট্রিং ল্যাটারালগুলির মধ্যে একটি ম্যাক্রো (বা উভয়) হয়। এরপরে সংকলনের সময় কনকনেটেশন ঘটে।
মেলিবিয়াস

8

আপনার সর্বদা প্রকারের প্রতি মনোযোগ দেওয়া উচিত ।

যদিও এগুলি সমস্ত স্ট্রিংয়ের মতো মনে হয় "Hello"এবং আক্ষরিক",world"

এবং আপনার উদাহরণে, exclamএকটি std::stringঅবজেক্ট।

সি ++ এর একটি অপারেটর ওভারলোড রয়েছে যা একটি std::stringঅবজেক্ট নেয় এবং এতে আরও একটি স্ট্রিং যুক্ত করে। আপনি যখন কোনও std::stringবস্তুকে আক্ষরিক সাথে যুক্ত করেন এটি আক্ষরিক জন্য উপযুক্ত কাস্টিং তৈরি করে।

তবে আপনি যদি দুটি আক্ষরিককে একত্রীকরণ করার চেষ্টা করেন, সংকলকটি দুটি অপরচালিত কোনও অপারেটর সন্ধান করতে সক্ষম হবে না।


দেখুন std :: অপারেটর + + যা concatenating জন্য অফার overloads std::stringঅপরের সাথে std::string, একটি অক্ষর অ্যারে, অথবা একটি একক অক্ষর।
ডেভিডআরআর

7

আপনার দ্বিতীয় উদাহরণটি কাজ করে না কারণ operator +দুটি স্ট্রিং লিটারেলের জন্য কোনও নেই । নোট করুন যে একটি স্ট্রিং আক্ষরিক টাইপ নয় string, পরিবর্তে টাইপযুক্ত const char *। আপনি যদি এটির মতো এটি সংশোধন করেন তবে আপনার দ্বিতীয় উদাহরণটি কাজ করবে:

const string message = string("Hello") + ",world" + exclam;


2

ক্ষেত্রে 1, ক্রিয়াকলাপ ক্রমের কারণে আপনি পান:

(হ্যালো + ", ওয়ার্ল্ড") + "!" যা হ্যালো + "এর সমাধান করে!" এবং অবশেষে হ্যালো

ক্ষেত্রে 2, যেমন জেমস উল্লেখ করেছেন, আপনি পাবেন:

("হ্যালো" + ", ওয়ার্ল্ড") + এক্সেলাম যা 2 টি স্ট্রিং লিটারেলের সমষ্টি।

আশা করি এটি পরিষ্কার হয়েছে :)


1

একটি স্ট্রিং (বা সুনির্দিষ্ট হতে std::string), এবং একটি অক্ষর আক্ষরিক মধ্যে পার্থক্য হ'ল পরবর্তীকালের জন্য কোনও +অপারেটর সংজ্ঞায়িত হয় না । এই কারণেই দ্বিতীয় উদাহরণ ব্যর্থ হয়।

প্রথম ক্ষেত্রে, সংকলকটি operator+প্রথম যুক্তিটি একটি stringএবং দ্বিতীয়টি অক্ষর অক্ষরে অক্ষর ( const char*) হিসাবে উপযুক্ত হিসাবে সন্ধান করতে পারে তাই এটি এটি ব্যবহার করে। সেই ক্রিয়াকলাপের ফলাফল আবার একটি string, সুতরাং এটি যুক্ত "!"করার সময় একই কৌশলটি পুনরাবৃত্তি করে ।

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