আপনি কি সি এবং সি++ প্রোগ্রামিং এর জাঁকজমকপূর্ণ বিশ্বে যোগ দিতে প্রস্তুত? আপনি কি C++ এর কয়েকটি সাধারণ লাইনের পরে আপনার অস্তিত্বকে প্রশ্ন করতে চান?
যদি আপনার উত্তর হয় "ইয়ে!", "হ্যাঁ" বা "কেন নয়?" - আপনার জ্ঞান পরীক্ষা করতে স্বাগতম। আপনাকে C বা C++ সম্পর্কিত একাধিক প্রশ্ন দেওয়া হবে।
গল্পের শেষে সঠিক উত্তর এবং ব্যাখ্যা খুঁজুন. শুভকামনা!
main;
আপনি যদি সি কম্পাইলার ব্যবহার করে এই প্রোগ্রামটি কম্পাইল করার চেষ্টা করেন তবে কী হবে?
#include <iostream> #include <unistd.h> int main() { for(auto i = 0; i < 1000; i++) std::cout << "Hello world!\n"; fork(); }
এই প্রোগ্রাম কত লাইন মুদ্রণ হবে?
#include <iostream> int main() { int array[] = { 1, 2, 3 }; std::cout << (4, (1, 2)[array]) << std::endl; }
এই প্রোগ্রাম কি মুদ্রণ হবে?
#include <regex> #include <iostream> int main() { std::regex re("(.*|.*)*O"); std::string str("0123456789"); std::cout << std::regex_match(str, re); return 0; }
এই ইনপুট স্ট্রিংটি মেলে এই রেগুলার এক্সপ্রেশনের জন্য কতক্ষণ লাগবে?
#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&)
#include <iostream> int x = 0; int bar(int(x)); int main() { std::cout << bar; }
এই প্রোগ্রাম কি মুদ্রণ হবে?
0
1
0x0
#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;
- বৈশ্বিক পরিবর্তনশীল।
সি কোডে আপনি অনেক কিছু বাদ দিতে পারেন। উদাহরণস্বরূপ আপনি একটি গ্লোবাল ভেরিয়েবলের ধরন বাদ দিতে পারেন। ডিফল্ট কম্পাইলার এই ধরনের একটি int
ধরে নিবে। এছাড়াও C তে কোন নাম ম্যাঙ্গলিং নেই (C++ এর বিপরীতে), তাই লিঙ্ক করার সময় ফাংশন main
থেকে পরিবর্তনশীল main
আলাদা করার কোন উপায় নেই।
এইভাবে কম্পাইলার বৈধ কোড কম্পাইল করবে, এবং লিঙ্কার একটি প্রোগ্রাম লিঙ্ক করার জন্য অবজেক্ট ফাইলে main
নামে কিছু খুঁজে পাবে।
কাঁটা
এটি C বা C++ বৈশিষ্ট্যের চেয়ে বেশি POSIX বৈশিষ্ট্য। IO অপারেশনের বাস্তবায়ন কর্মক্ষমতা অপ্টিমাইজ করার জন্য বাফার ব্যবহার করে। আপনি যখন fork
চালু করবেন, ওএস প্রসেস মেমরির কপি-অন-রাইট ডুপ্লিকেট তৈরি করবে, IO-বাফারগুলিও সম্ভবত ডুপ্লিকেট হবে এবং বাফারযুক্ত স্ট্রিংগুলি 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.
অন্যান্য সম্ভাব্য বিকল্প আশ্চর্যজনকভাবে দীর্ঘ সময় বা প্রত্যাশিত হিসাবে কাজ. কারণ নিয়মিত এক্সপ্রেশন বাস্তবায়নের জন্য দুটি সম্ভাব্য পন্থা রয়েছে।
প্রথম - রেগুলার এক্সপ্রেশনকে সীমাবদ্ধ অটোমেটা O(n**2)
(n - প্যাটার্নের দৈর্ঘ্য), স্ট্রিং O(m)
(m - স্ট্রিংয়ের দৈর্ঘ্য) তে রূপান্তর করুন। এই পদ্ধতি ব্যাকট্র্যাকিং সমর্থন করে না।
দ্বিতীয় - লোভী পন্থা + DFS, ব্যাকট্র্যাকিং সমর্থন করে কিন্তু নির্দিষ্ট প্যাটার্নে সূচকীয় সময় জটিলতার প্রবণতা।
চলে এবং ল্যাম্বডাস
উত্তর হল Foo(const Foo&)
। Lambdas ডিফল্টরূপে অপরিবর্তনীয়, []
এর সাথে ল্যাম্বডা-তে ক্যাপচার করা সমস্ত মানই নিহিতভাবে 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
নামে ক্লাস মেম্বার এই সুযোগে লুকিয়ে আছে।