paint-brush
সি এবং সি++ এর লুকানো রত্ন যা আপনি সম্ভবত জানেন নাদ্বারা@udalov
11,231 পড়া
11,231 পড়া

সি এবং সি++ এর লুকানো রত্ন যা আপনি সম্ভবত জানেন না

দ্বারা Ilia6m2024/08/09
Read on Terminal Reader

অতিদীর্ঘ; পড়তে

C++ অনেকগুলি বৈশিষ্ট্য সহ একটি দুর্দান্ত ভাষা। একজন C++ বিকাশকারী হিসেবে আমার ক্যারিয়ার জুড়ে আমি একাধিক "WTF" মুহূর্ত অনুভব করেছি। এই গল্পে, আপনি পরীক্ষার আকারে ঘনীভূত C এবং C++ প্রোগ্রামিংয়ের সবচেয়ে বিনোদনমূলক দিকগুলি পাবেন। কোন উপায়ে আপনি একটি দম্পতি প্রশ্ন বেশী পেতে পারেন.
featured image - সি এবং সি++ এর লুকানো রত্ন যা আপনি সম্ভবত জানেন না
Ilia HackerNoon profile picture
0-item
1-item

আপনি কি সি এবং সি++ প্রোগ্রামিং এর জাঁকজমকপূর্ণ বিশ্বে যোগ দিতে প্রস্তুত? আপনি কি C++ এর কয়েকটি সাধারণ লাইনের পরে আপনার অস্তিত্বকে প্রশ্ন করতে চান?


যদি আপনার উত্তর হয় "ইয়ে!", "হ্যাঁ" বা "কেন নয়?" - আপনার জ্ঞান পরীক্ষা করতে স্বাগতম। আপনাকে C বা C++ সম্পর্কিত একাধিক প্রশ্ন দেওয়া হবে।


গল্পের শেষে সঠিক উত্তর এবং ব্যাখ্যা খুঁজুন. শুভকামনা!

1. ক্ষুদ্রতম প্রোগ্রাম

 main;


আপনি যদি সি কম্পাইলার ব্যবহার করে এই প্রোগ্রামটি কম্পাইল করার চেষ্টা করেন তবে কী হবে?

  1. কম্পাইল হবে না
  2. কম্পাইল করবে, লিঙ্ক করবে না
  3. কম্পাইল করবে এবং লিঙ্ক করবে

2. কাঁটা

 #include <iostream> #include <unistd.h> int main() { for(auto i = 0; i < 1000; i++) std::cout << "Hello world!\n"; fork(); }


এই প্রোগ্রাম কত লাইন মুদ্রণ হবে?

  1. 1000
  2. 1000 এর কম
  3. 1000 এর বেশি

3. আপনার যা দরকার তা হল সূচক

 #include <iostream> int main() { int array[] = { 1, 2, 3 }; std::cout << (4, (1, 2)[array]) << std::endl; }


এই প্রোগ্রাম কি মুদ্রণ হবে?

  1. 1
  2. 2
  3. 3
  4. 4
  5. কম্পাইল হবে না
  6. অনির্ধারিত

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 মি.সে
  2. 1 সেকেন্ড
  3. 1 মিনিট
  4. 1 ঘন্টা
  5. 1 বছর
  6. চিরকাল

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; }


এই প্রোগ্রাম দ্বারা মুদ্রিত করা শেষ লাইন হল...


  1. Foo()
  2. Foo(Foo&&)
  3. Foo(const Foo&)

6. X এবং বার

 #include <iostream> int x = 0; int bar(int(x)); int main() { std::cout << bar; }


এই প্রোগ্রাম কি মুদ্রণ হবে?

  1. 0
  2. 1
  3. 0x0
  4. কম্পাইল হবে না
  5. লিঙ্ক হবে না

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(); }


এই প্রোগ্রাম দ্বারা মুদ্রিত করা শেষ লাইন হল...

  1. Foo(int, int)
  2. Foo(const Foo&, int)
  3. Foo(int, const Foo&)
  4. Foo(int)

উপসংহারের পরিবর্তে

আমি আশা করি আপনি বন্য মধ্যে এই অদ্ভুত স্নিপেট এক খুঁজে পাবেন না.

উত্তর

  1. সবচেয়ে ছোট প্রোগ্রাম


    এটি আইনি সি কোড। এটি সফলভাবে কম্পাইল এবং লিঙ্ক করবে। আপনি এটি চালানোর চেষ্টা করলে এটি ক্র্যাশ হবে। main; - বৈশ্বিক পরিবর্তনশীল।


    সি কোডে আপনি অনেক কিছু বাদ দিতে পারেন। উদাহরণস্বরূপ আপনি একটি গ্লোবাল ভেরিয়েবলের ধরন বাদ দিতে পারেন। ডিফল্ট কম্পাইলার এই ধরনের একটি int ধরে নিবে। এছাড়াও C তে কোন নাম ম্যাঙ্গলিং নেই (C++ এর বিপরীতে), তাই লিঙ্ক করার সময় ফাংশন main থেকে পরিবর্তনশীল main আলাদা করার কোন উপায় নেই।


    এইভাবে কম্পাইলার বৈধ কোড কম্পাইল করবে, এবং লিঙ্কার একটি প্রোগ্রাম লিঙ্ক করার জন্য অবজেক্ট ফাইলে main নামে কিছু খুঁজে পাবে।


  2. কাঁটা


    এটি C বা C++ বৈশিষ্ট্যের চেয়ে বেশি POSIX বৈশিষ্ট্য। IO অপারেশনের বাস্তবায়ন কর্মক্ষমতা অপ্টিমাইজ করার জন্য বাফার ব্যবহার করে। আপনি যখন fork চালু করবেন, ওএস প্রসেস মেমরির কপি-অন-রাইট ডুপ্লিকেট তৈরি করবে, IO-বাফারগুলিও সম্ভবত ডুপ্লিকেট হবে এবং বাফারযুক্ত স্ট্রিংগুলি 1000 বারের বেশি মুদ্রিত হবে


  3. আপনার যা দরকার তা হল সূচক


    উত্তর হল 3


    এই কোডটি বোঝার জন্য C এবং C++ এ সূচকগুলি কীভাবে কাজ করে তা আরও ঘনিষ্ঠভাবে দেখে নেওয়া যাক: array[index] , *(array + index) এর মতো, (index + array) এর মতো এবং index[array এর মতো .

    দ্বিতীয় সূত্রটি হল অপারেটর , . এর বাইনারি অপারেটর, এটি বাম আর্গুমেন্ট বাতিল করে এবং ডান আর্গুমেন্ট ফেরত দেয়।


  4. নিয়মিত অভিব্যক্তি


    কী ঘটবে তা অনুমান করা অসম্ভব ! আচরণ বাস্তবায়ন পর্যন্ত হয়.


    আমি আমার পরিবেশ এই প্রোগ্রামটি ব্যতিক্রম উত্থাপন The complexity of an attempted match against a regular expression exceeded a pre-set level.


    অন্যান্য সম্ভাব্য বিকল্প আশ্চর্যজনকভাবে দীর্ঘ সময় বা প্রত্যাশিত হিসাবে কাজ. কারণ নিয়মিত এক্সপ্রেশন বাস্তবায়নের জন্য দুটি সম্ভাব্য পন্থা রয়েছে।


    প্রথম - রেগুলার এক্সপ্রেশনকে সীমাবদ্ধ অটোমেটা O(n**2) (n - প্যাটার্নের দৈর্ঘ্য), স্ট্রিং O(m) (m - স্ট্রিংয়ের দৈর্ঘ্য) তে রূপান্তর করুন। এই পদ্ধতি ব্যাকট্র্যাকিং সমর্থন করে না।


    দ্বিতীয় - লোভী পন্থা + DFS, ব্যাকট্র্যাকিং সমর্থন করে কিন্তু নির্দিষ্ট প্যাটার্নে সূচকীয় সময় জটিলতার প্রবণতা।


  5. চলে এবং ল্যাম্বডাস


    উত্তর হল Foo(const Foo&) । Lambdas ডিফল্টরূপে অপরিবর্তনীয়, [] এর সাথে ল্যাম্বডা-তে ক্যাপচার করা সমস্ত মানই নিহিতভাবে const । এটি ল্যাম্বডাসের জন্য অদম্য আচরণকে আনলক করে।


    যখন আপনি f সরান তখন আপনি const Foo&& তৈরি করেন। const Foo&& একটি অদ্ভুত ধরনের, এইভাবে কম্পাইলার শুধু Foo কপি করে


    এটি ঠিক করার দুটি উপায় আছে:


    1. পরিবর্তনযোগ্য ল্যাম্বডা তৈরি করুন

       auto a = [f = std::move(f)]() mutable { return std::move(f); };


    2. কনস্ট্রাক্টর Foo(const Foo&&)


  6. এক্স এবং বার

    প্রোগ্রামটি 1 প্রিন্ট করবে।


    int bar(int(x)); — ফাংশন ঘোষণা করার অদ্ভুত উপায়, এটি int bar(int x); .

    আপনি যদি টাইপ কাস্টের সাথে বিভ্রান্ত হন, int bar((int(x))); - এটি টাইপ কাস্ট।


    আমরা নিহিতভাবে bool ফাংশন অ্যাড্রেস কাস্ট করার চেষ্টা করার চেয়ে, এই জাতীয় কাস্টের ফলাফল সর্বদা true


    ফাংশন bar() কখনই ব্যবহার করা হয়নি, এটি আমাদের লিঙ্ক করার সময় অনির্ধারিত প্রতীক ত্রুটিকে ডজ করতে দেয়।


  7. কনস্ট্রাক্টর

    শেষ লাইনটি Foo(const Foo&, int)


    Foo(i) হল পরিবর্তনশীল ঘোষণা, Foo i মতই। এভাবে i নামে ক্লাস মেম্বার এই সুযোগে লুকিয়ে আছে।