লুপের ভিতরে কোনও ভেরিয়েবল সংজ্ঞা দেওয়া ভাল? [বন্ধ]


15

আমার প্রশিক্ষক একবার আমাকে বলেছিলেন যে আমার কোনও লুপের ভিতরে একটি পরিবর্তনশীল সংজ্ঞা দেওয়া উচিত নয় , তবে আমি কেন সত্যিই এখনও বুঝতে পারি না।

এর অসুবিধাগুলি কী কী?

কোনও দেহ আমাকে তা ব্যাখ্যা করতে পারে?


7
আপনার প্রশিক্ষক কি প্রোগ্রামিং ভাষা শেখানো ছিল?
ব্রায়ান

2
যদি আপনি একটি লুপে একটি প্রাক-প্রিমিটিভ টাইপ সহ একটি ভেরিয়েবল সংজ্ঞায়িত করেন তবে আপনার প্রোগ্রামটি অযথাই লুপের মাধ্যমে প্রতিবার এটির নির্মাণকারীকে কল করতে পারে। আপনি যদি একবার লুপের বাইরে এটি সংজ্ঞায়িত করতে চান তবে এটি করুন।
ব্র্যান্ডিন

17
যখন কোনও প্রশিক্ষক কী বলেন সে সম্পর্কে আপনার যদি এইরকম বিভ্রান্তি থাকে, তবে সর্বোত্তম সংস্থানটি প্রশিক্ষককে জিজ্ঞাসা করে। তারা আপনাকে ঘন পিছনে যোগাযোগ করতে পারে যা কোনও প্রশ্নোত্তর সাইট সরবরাহ করতে পারে না।

1
ক্রস-সাইট সদৃশ: লুপের আগে বা লুপে ভেরিয়েবল ঘোষণার মধ্যে পার্থক্য? (এবং অবশ্যই অনেকগুলি এই জাতীয় প্রাথমিক প্রশ্নের জন্য সেই সাইটে অনেকগুলি নকল (কেবলমাত্র সি ++ সম্পর্কিত বিষয়গুলি সহ))।
পিটার মর্টেনসেন

2
সেই পরামর্শটি একটি প্রসঙ্গে নির্দিষ্ট ছিল। ব্যক্তিগত স্টাইলের বিষয় হিসাবে, আমি আমার পরিবর্তনগুলি ঘোষণা করতে পছন্দ করি constযদি না হয় (কার্যকরী প্রোগ্রামিংয়ের অভ্যাস) না থাকে। হয় আমি তাদের সংশোধন করব না, এবং অপ্টিমাইজারটি সনাক্ত করতে হবে যখন তাদের প্রয়োজন হয় না, অথবা আমি করব এবং আমি একটি গুরুতর বাগটি প্রতিরোধ করেছি। যখন এই ধ্রুবক মধ্যবর্তী মানগুলি লুপের পুনরাবৃত্তির সাথে সুনির্দিষ্ট হয়, তার অর্থ লুপের অভ্যন্তরে এগুলি ঘোষণা করা। অন্য সময় যখন আপনাকে লুপের বাইরে ভেরিয়েবলগুলি ঘোষণা করতে হবে, যখন আপনি লুপের বাইরে তাদের উল্লেখ করবেন; উদাহরণস্বরূপ, আপনি ফলাফল সংরক্ষণ করছেন।
ডেভিস্লোর

উত্তর:


42

লুপের মধ্যে একটি ভেরিয়েবল সংজ্ঞায়িত করা কোনও সমস্যা নয় । প্রকৃতপক্ষে, এটি ভাল অনুশীলন, যেহেতু শনাক্তকারীদের সম্ভাব্যতম ক্ষুদ্রতম ক্ষেত্রে সীমাবদ্ধ করা উচিত।

খারাপটি হ'ল লুপের মধ্যে একটি ভেরিয়েবল বরাদ্দ করা যদি আপনি লুপটি চালানোর আগে একবার ঠিক এটি নির্ধারণ করতে পারেন । অ্যাসাইনমেন্টের ডান দিকের দিকটি কতটা জটিল তার উপর নির্ভর করে এটি বরং ব্যয়বহুল হয়ে উঠতে পারে এবং লুপের রান টাইমেও প্রভাব ফেলতে পারে। আপনি যদি এমন একটি লুপ লিখে থাকেন যা সমস্ত পুনরাবৃত্তির ক্ষেত্রে একই গণিত মান ব্যবহার করে, আপনার অবশ্যই এটি অবশ্যই লুপের উপরে গণনা করা উচিত - এটির পরিধিটি হ্রাস করার চেয়ে গুরুত্বপূর্ণ।

স্পষ্ট করতে: যতক্ষণ না compute()সর্বদা একই মান প্রদান করে, এটি

int value = compute();
while (something) {
    doSomething(value);
}

এর চেয়ে স্মার্ট:

while (something) {
    int value = compute();
    doSomething(value);
}

2
আপনি কীভাবে লুপের মধ্যে একটি পরিবর্তনশীল সংজ্ঞায়িত করবেন এবং লুপের আগে এটি নির্ধারণ করবেন?
মুখোশধারী মানুষ

6
@ মাস্কডম্যান, আমি মনে করি আপনি ভুল বুঝে চলেছেন। কিলিয়ান বলতে যা বোঝায় তা হল যদি আপনার কোনও ভেরিয়েবল থাকে যা লুপের প্রতিটি পুনরাবৃত্তির সময় একই মান নির্ধারিত হয়, যেমন একই তারিখের ভেরিয়েবল সেট করা থাকে 1/1/1900, ভেরিয়েবলটি ঘোষণা করা উচিত এবং লুপের আগে মান নির্ধারণ করা উচিত be
PS2goat

2
আমি মনে করি না গত কুড়ি বছরে (কোনও আন্ডারগ্রাড সংকলক কোর্সের বাইরে) লিখিত একটি সংকলক লিখেছেন যে আপনি প্রতিটি পুনরাবৃত্তির জন্য একই মান নির্ধারণ করছেন এবং সেই কার্যটি লুপের বাইরে সরিয়ে দেবেন না।
টিএমএন

14
@ টিএমএন: কোনও সংকলককে কখনই বৃহত্তর কোডের স্বচ্ছতার সাথে আপনি নিজেকে তুচ্ছভাবে করতে পারেন তা করতে দেবেন না।
রবার্ট হার্ভে

10
@ টিএমএন, অগত্যা নয়। সেই অপ্টিমাইজেশন কেবল তখনই সম্ভব যদি সংকলক প্রমাণ করতে পারে যে গণনাটি পার্শ্ব-প্রতিক্রিয়া মুক্ত।
পল ড্রপার

16

জটিল ধরণের অ-তুচ্ছ নির্মাণকারী এবং ধ্বংসকারী রয়েছে const

এগুলি লুপের বডিটির শুরু এবং শেষের দিকে ডাকা হবে (এটি যেমন আরম্ভ করা হয়েছে এবং স্কোপের বাইরে চলে যায়)। সূচনাটি যদি ব্যয়বহুল হয় তবে এটির জন্য কিছু মেমরি বরাদ্দ করা দরকার তবে তা এড়ানো উচিত।

তবে তুচ্ছ ধরণের জন্য যা কোনও সমস্যা নয়। বরাদ্দ এবং ডিএলোকেশন নিজেই কেবল স্ট্যাক পয়েন্টার থেকে একটি মান যোগ এবং বিয়োগ করে। (যা অনুকূলিত হবে)


ধন্যবাদ, আমি ঠিক যে উত্তরটি খুঁজছিলাম!
gebbissimo

6

ঠিক আছে, তাঁর পরামর্শটি কিছুটা সহজ that's
তা থেকে সব পথ রেঞ্জ অনুসরণ একটি ভাল ধারণা উপর যারা বজায় রাখে এবং খারাপ ধারণা করার অসম্ভব

  1. পুরানোটিকে ধ্বংস করা এবং একটি নতুন তৈরি করার চেয়ে পুনরায় ব্যবহার করা যখন কম সস্তা হয় তখন আপনার এটিকে অনুসরণ করা উচিত।

    #include <iostream>
    #include <string>
    
    int main() {
        std::string s; // Don't needlessly free the buffer
        while ((std::cin >> s))
            std::cout << s;
    }
  2. পারফরম্যান্সের জন্য কোনও ব্যাপার না হলে আপনার এটি স্টাইলের বিষয় হিসাবে এড়িয়ে চলা উচিত।

    #include <stdio.h>
    #include <stdlib.h>
    int f(int, int);
    
    int main() {
        for (int i = 0; i < 100; ++i) {
            int x = rand(); // Declared here so you don't need to hunt it down.
            printf("%d => %d\n", x, f(x-1, x+i));
        }
    }
  3. খারাপ খারাপ পারফরম্যান্স বা ভুল শব্দার্থবিজ্ঞান থাকলে আপনার সত্যই এড়িয়ে যাওয়া উচিত।

    #include <iostream>
    #include <string>
    std::string generate(int);
    
    int main() {
        for(int i = 0; i < 100; ++i) {
            std::string s = generate(i); // Using copy-ellision here
            std::cout << s;
        }
    }
  4. আপনি ব্যবহার করতে পারবেন না যখন ব্যবহৃত প্রকারটি অদলবদল, না সরানো-বরাদ্দকরণ বা অনুলিপি-অ্যাসাইনমেন্টের অনুমতি দেয়।

    #include <iostream>
    #include <puzzle>
    
    int main() {
        for (int i = 0; i < 100; ++i) {
            Puzzle x(i); // Puzzle is an immutable class. For whatever reasons.
            std::cout << x;
        }
    }

2
আপনার "লুপে" এর সংজ্ঞা অনুসারে 1 টি পরিবর্তন করা যায় for (std::string s; std::cin >> s;) ...এবং এখনও "বাহিরে" থাকতে পারে
কালেথ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.