আপনি কি সি এবং সি++ প্রোগ্রামিং এর জাঁকজমকপূর্ণ বিশ্বে যোগ দিতে প্রস্তুত? আপনি কি C++ এর কয়েকটি সাধারণ লাইনের পরে আপনার অস্তিত্বকে প্রশ্ন করতে চান? যদি আপনার উত্তর হয় "ইয়ে!", "হ্যাঁ" বা "কেন নয়?" - আপনার জ্ঞান পরীক্ষা করতে স্বাগতম। আপনাকে C বা C++ সম্পর্কিত একাধিক প্রশ্ন দেওয়া হবে। গল্পের শেষে সঠিক উত্তর এবং ব্যাখ্যা খুঁজুন. শুভকামনা! 1. ক্ষুদ্রতম প্রোগ্রাম main; আপনি যদি সি কম্পাইলার ব্যবহার করে এই প্রোগ্রামটি কম্পাইল করার চেষ্টা করেন তবে কী হবে? কম্পাইল হবে না কম্পাইল করবে, লিঙ্ক করবে না কম্পাইল করবে এবং লিঙ্ক করবে 2. কাঁটা #include <iostream> #include <unistd.h> int main() { for(auto i = 0; i < 1000; i++) std::cout << "Hello world!\n"; fork(); } এই প্রোগ্রাম কত লাইন মুদ্রণ হবে? 1000 1000 এর কম 1000 এর বেশি 3. আপনার যা দরকার তা হল সূচক #include <iostream> int main() { int array[] = { 1, 2, 3 }; std::cout << (4, (1, 2)[array]) << std::endl; } এই প্রোগ্রাম কি মুদ্রণ হবে? 1 2 3 4 কম্পাইল হবে না অনির্ধারিত 4. নিয়মিত অভিব্যক্তি #include <regex> #include <iostream> int main() { std::regex re("(.*|.*)*O"); std::string str("0123456789"); std::cout << std::regex_match(str, re); return 0; } এই ইনপুট স্ট্রিংটি মেলে এই রেগুলার এক্সপ্রেশনের জন্য কতক্ষণ লাগবে? 1 মি.সে 1 সেকেন্ড 1 মিনিট 1 ঘন্টা 1 বছর চিরকাল 5. মুভ এবং ল্যাম্বডাস #include <iostream> struct Foo { Foo() { std::cout << "Foo()\n"; } Foo(Foo&&) { std::cout << "Foo(Foo&&)\n"; } Foo(const Foo&) { std::cout << "Foo(const Foo&)\n"; } }; int main() { Foo f; auto a = [f = std::move(f)]() { return std::move(f); }; Foo f2(a()); return 0; } এই প্রোগ্রাম দ্বারা মুদ্রিত করা শেষ লাইন হল... Foo() Foo(Foo&&) Foo(const Foo&) 6. X এবং বার #include <iostream> int x = 0; int bar(int(x)); int main() { std::cout << bar; } এই প্রোগ্রাম কি মুদ্রণ হবে? 0 1 0x0 কম্পাইল হবে না লিঙ্ক হবে না 7. কনস্ট্রাক্টর #include <iostream> struct Foo { Foo() { std::cout << "Foo()\n"; } Foo(const Foo&) { std::cout << "Foo(const Foo&)\n"; } Foo(int) { std::cout << "Foo(int)\n"; } Foo(int, int) { std::cout << "Foo(int, int)\n"; } Foo(const Foo&, int) { std::cout << "Foo(const Foo&, int)\n"; } Foo(int, const Foo&) { std::cout << "Foo(int, const Foo&)\n"; } }; void f(Foo) {} struct Bar { int i, j; Bar() { f(Foo(i, j)); f(Foo(i)); Foo(i, j); Foo(i); Foo(i, j); } }; int main() { Bar(); } এই প্রোগ্রাম দ্বারা মুদ্রিত করা শেষ লাইন হল... Foo(int, int) Foo(const Foo&, int) Foo(int, const Foo&) Foo(int) উপসংহারের পরিবর্তে আমি আশা করি আপনি বন্য মধ্যে এই অদ্ভুত স্নিপেট এক খুঁজে পাবেন না. উত্তর সবচেয়ে ছোট প্রোগ্রাম এটি আইনি সি কোড। আপনি এটি চালানোর চেষ্টা করলে এটি ক্র্যাশ হবে। - বৈশ্বিক পরিবর্তনশীল। এটি সফলভাবে কম্পাইল এবং লিঙ্ক করবে। main; সি কোডে আপনি অনেক কিছু বাদ দিতে পারেন। উদাহরণস্বরূপ আপনি একটি গ্লোবাল ভেরিয়েবলের ধরন বাদ দিতে পারেন। ডিফল্ট কম্পাইলার এই ধরনের একটি ধরে নিবে। এছাড়াও C তে কোন নেই (C++ এর বিপরীতে), তাই লিঙ্ক করার সময় ফাংশন থেকে পরিবর্তনশীল আলাদা করার কোন উপায় নেই। int নাম ম্যাঙ্গলিং main main এইভাবে কম্পাইলার বৈধ কোড কম্পাইল করবে, এবং লিঙ্কার একটি প্রোগ্রাম লিঙ্ক করার জন্য অবজেক্ট ফাইলে নামে কিছু খুঁজে পাবে। main কাঁটা এটি C বা C++ বৈশিষ্ট্যের চেয়ে বেশি POSIX বৈশিষ্ট্য। IO অপারেশনের বাস্তবায়ন কর্মক্ষমতা অপ্টিমাইজ করার জন্য বাফার ব্যবহার করে। আপনি যখন চালু করবেন, ওএস প্রসেস মেমরির কপি-অন-রাইট ডুপ্লিকেট তৈরি করবে, IO-বাফারগুলিও সম্ভবত ডুপ্লিকেট হবে এবং বাফারযুক্ত স্ট্রিংগুলি । fork 1000 বারের বেশি মুদ্রিত হবে আপনার যা দরকার তা হল সূচক উত্তর হল 3 এই কোডটি বোঝার জন্য C এবং C++ এ সূচকগুলি কীভাবে কাজ করে তা আরও ঘনিষ্ঠভাবে দেখে নেওয়া যাক: , এর মতো, এর মতো এবং এর মতো . array[index] *(array + index) (index + array) index[array দ্বিতীয় সূত্রটি হল অপারেটর . এর বাইনারি অপারেটর, এটি বাম আর্গুমেন্ট বাতিল করে এবং ডান আর্গুমেন্ট ফেরত দেয়। , নিয়মিত অভিব্যক্তি কী ঘটবে তা ! আচরণ বাস্তবায়ন পর্যন্ত হয়. অনুমান করা অসম্ভব আমি আমার পরিবেশ এই প্রোগ্রামটি ব্যতিক্রম উত্থাপন The complexity of an attempted match against a regular expression exceeded a pre-set level. অন্যান্য সম্ভাব্য বিকল্প আশ্চর্যজনকভাবে দীর্ঘ সময় বা প্রত্যাশিত হিসাবে কাজ. কারণ নিয়মিত এক্সপ্রেশন বাস্তবায়নের জন্য দুটি সম্ভাব্য পন্থা রয়েছে। প্রথম - রেগুলার এক্সপ্রেশনকে সীমাবদ্ধ অটোমেটা (n - প্যাটার্নের দৈর্ঘ্য), স্ট্রিং (m - স্ট্রিংয়ের দৈর্ঘ্য) তে রূপান্তর করুন। এই পদ্ধতি O(n**2) O(m) ব্যাকট্র্যাকিং সমর্থন করে না। দ্বিতীয় - লোভী পন্থা + DFS, ব্যাকট্র্যাকিং সমর্থন করে কিন্তু নির্দিষ্ট প্যাটার্নে সূচকীয় সময় জটিলতার প্রবণতা। চলে এবং ল্যাম্বডাস উত্তর হল । Lambdas ডিফল্টরূপে অপরিবর্তনীয়, এর সাথে ল্যাম্বডা-তে ক্যাপচার করা সমস্ত মানই নিহিতভাবে । এটি ল্যাম্বডাসের জন্য আচরণকে আনলক করে। Foo(const Foo&) [] const অদম্য যখন আপনি সরান তখন আপনি তৈরি করেন। একটি অদ্ভুত ধরনের, এইভাবে কম্পাইলার শুধু কপি করে f const Foo&& const Foo&& Foo এটি ঠিক করার দুটি উপায় আছে: পরিবর্তনযোগ্য ল্যাম্বডা তৈরি করুন auto a = [f = std::move(f)]() mutable { return std::move(f); }; কনস্ট্রাক্টর Foo(const Foo&&) এক্স এবং বার প্রিন্ট করবে। প্রোগ্রামটি 1 — ফাংশন ঘোষণা করার অদ্ভুত উপায়, এটি . int bar(int(x)); int bar(int x); আপনি যদি টাইপ কাস্টের সাথে বিভ্রান্ত হন, - এটি টাইপ কাস্ট। int bar((int(x))); আমরা নিহিতভাবে ফাংশন অ্যাড্রেস কাস্ট করার চেষ্টা করার চেয়ে, এই জাতীয় কাস্টের ফলাফল সর্বদা । bool true ফাংশন কখনই ব্যবহার করা হয়নি, এটি আমাদের লিঙ্ক করার সময় অনির্ধারিত প্রতীক ত্রুটিকে ডজ করতে দেয়। bar() কনস্ট্রাক্টর শেষ লাইনটি । Foo(const Foo&, int) হল পরিবর্তনশীল ঘোষণা, মতই। এভাবে নামে ক্লাস মেম্বার এই সুযোগে লুকিয়ে আছে। Foo(i) Foo i i