আমি একটি for
পরিবর্তে একটি লুপ অবস্থায় দুটি ভেরিয়েবল বৃদ্ধি করতে চাই ।
সুতরাং যেমন কিছু:
for (int i = 0; i != 5; ++i and ++j)
do_something(i, j);
এর সিনট্যাক্স কী?
আমি একটি for
পরিবর্তে একটি লুপ অবস্থায় দুটি ভেরিয়েবল বৃদ্ধি করতে চাই ।
সুতরাং যেমন কিছু:
for (int i = 0; i != 5; ++i and ++j)
do_something(i, j);
এর সিনট্যাক্স কী?
উত্তর:
একটি প্রচলিত প্রজ্ঞা হ'ল কমা অপারেটরটি ব্যবহার করা যা উভয় অপারেন্ডকে মূল্যায়ন করে এবং দ্বিতীয় অপারেন্ডকে ফিরিয়ে দেয়। এইভাবে:
for(int i = 0; i != 5; ++i,++j)
do_something(i,j);
এখন এটি লিখেছেন, একজন মন্তব্যকারী পরামর্শ দিয়েছিলেন যে এটি আসলে বিবৃতি দেওয়ার জন্য কিছু বিশেষ সিনট্যাকটিক চিনি ছিল, এবং কোনও কমা অপারেটর নয়। আমি জিসিসিতে এটি নীচে পরীক্ষা করেছি:
int i=0;
int a=5;
int x=0;
for(i; i<5; x=i++,a++){
printf("i=%d a=%d x=%d\n",i,a,x);
}
আমি এক্স এর মূল মান বাছাই করার প্রত্যাশা করছিলাম, সুতরাং এটি এক্স এর জন্য 5,6,7 .. প্রদর্শিত হবে। যা পেলাম তা এই ছিল
i=0 a=5 x=0
i=1 a=6 x=0
i=2 a=7 x=1
i=3 a=8 x=2
i=4 a=9 x=3
যাইহোক, আমি যদি পার্সারটিকে সত্যিকার অর্থে কমা অপারেটরকে দেখে জোর করার জন্য অভিব্যক্তিটি বন্ধন করেছিলাম তবে আমি এটি পেয়েছি
int main(){
int i=0;
int a=5;
int x=0;
for(i=0; i<5; x=(i++,a++)){
printf("i=%d a=%d x=%d\n",i,a,x);
}
}
i=0 a=5 x=0
i=1 a=6 x=5
i=2 a=7 x=6
i=3 a=8 x=7
i=4 a=9 x=8
প্রাথমিকভাবে আমি ভেবেছিলাম যে এটি দেখায় এটি একেবারে কমা অপারেটর হিসাবে আচরণ করছে না, তবে যেমনটি দেখা যাচ্ছে যে কমা অপারেটরের সম্ভাব্যতমতম নজির রয়েছে , তাই এক্স = আই ++, একটি ++ কার্যকরভাবে কার্যকর (x = i ++), a ++ হিসাবে পার্স করা হয়েছে
সমস্ত মন্তব্যের জন্য ধন্যবাদ, এটি একটি আকর্ষণীয় শেখার অভিজ্ঞতা ছিল, এবং আমি সি ব্যবহার করছি বহু বছর ধরে!
এটা চেষ্টা কর
for(int i = 0; i != 5; ++i, ++j)
do_something(i,j);
for( ; ; ((++i), (++j)) )
for(int i = 0; i != 5; (++i)) {
অতিরিক্ত প্যারেনসিস সংকলকটিকে ভাবতে প্ররোচিত করে যে এটি আর কোনও "ইনক্রিমেন্ট" অপারেশন নয়।
এটি না করার চেষ্টা করুন!
Http://www.research.att.com/~bs/JSF-AV-rules.pdf থেকে :
এভি বিধি 199 199
লুপের জন্য ইনক্রিমেন্ট এক্সপ্রেশন লুপের জন্য পরবর্তী মানটিতে একটি একক লুপ পরামিতি পরিবর্তন করা ছাড়া আর কোনও পদক্ষেপ করবে না।যুক্তি: পাঠযোগ্যতা।
আমি এখানে নিজেকে স্মরণ করিয়ে দিতে এসেছি যে কীভাবে একটি ফর লুপের ইনক্রিমেন্ট ক্লজে দ্বিতীয় সূচকটি কোড করা যায়, যা আমি জানতাম যে এটি মূলত আমি যে কোনও প্রকল্পে অন্তর্ভুক্ত করেছি এমন একটি নমুনায় পর্যবেক্ষণ করা যা সি ++ তে লেখা ছিল।
আজ, আমি সি # তে কাজ করছি, তবে আমি নিশ্চিত হয়েছি যে এটি এই ক্ষেত্রে একই নিয়ম মানবে, যেহেতু ফর স্টেটমেন্টটি সমস্ত প্রোগ্রামিংয়ের অন্যতম প্রাচীন নিয়ন্ত্রণ কাঠামো। ধন্যবাদ, আমি সম্প্রতি আমার পুরানো একটি সি প্রোগ্রামের একটি ফর লুপের আচরণের ডকুমেন্টিং করে বেশ কয়েক দিন অতিবাহিত করেছি এবং আমি দ্রুত বুঝতে পেরেছিলাম যে সেই গবেষণাগুলি এমন পাঠগুলি ধারণ করেছিল যা আজকের সি # সমস্যার ক্ষেত্রে প্রয়োগ হয়েছিল, বিশেষত দ্বিতীয় সূচক ভেরিয়েবলের আচরণের জন্য held ।
অযত্নের জন্য, নীচে আমার পর্যবেক্ষণের সংক্ষিপ্তসার রইল। লোকাল উইন্ডোতে সাবধানতার সাথে ভেরিয়েবল পর্যবেক্ষণ করে আমি আজ যা ঘটতে দেখেছি তা আমার প্রত্যাশা নিশ্চিত করেছে যে একটি সি # ফর স্টেটমেন্ট বিবৃতিতে সি বা সি ++ এর মতো হুবহু আচরণ করে।
লুপটি শেষ হওয়ার পরে যদি আপনার সূচকগুলির কোনও ভেরিয়েবল স্কোপে থেকে যায় তবে সত্যিকারের সূচক ভেরিয়েবলের ক্ষেত্রে তাদের মান লুপটি থামানো থ্রেশহোল্ডের চেয়ে একগুণ বেশি হবে। অনুরূপভাবে, উদাহরণস্বরূপ, লুপটি প্রবেশের আগে দ্বিতীয় ভেরিয়েবলটি শূন্যে শুরু করা হয়, শেষে এটির মান হবে পুনরাবৃত্তি গণনা, ধরে নেওয়া যে এটি একটি বৃদ্ধি (++), কোনও হ্রাস নয়, এবং এতে কিছুই নেই লুপের বডি তার মান পরিবর্তন করে।
আমি squelart সাথে একমত। দুটি ভেরিয়েবল বৃদ্ধি করা বাগ প্রবণ, বিশেষত যদি আপনি কেবল তার মধ্যে একটির জন্য পরীক্ষা করেন।
এটি করার পঠনযোগ্য উপায়:
int j = 0;
for(int i = 0; i < 5; ++i) {
do_something(i, j);
++j;
}
For
লুপগুলি এমন ক্ষেত্রে বোঝানো হয় যেখানে আপনার লুপটি একটি ক্রমবর্ধমান / হ্রাসযোগ্য চলকটির উপরে চলে। অন্য কোনও ভেরিয়েবলের জন্য এটি লুপে পরিবর্তন করুন।
যদি আপনার j
সাথে আবদ্ধ হওয়ার প্রয়োজন হয় i
, তবে কেন মূল আসলটি যুক্ত হিসাবে যুক্ত করে যুক্ত করবেন না i
?
for(int i = 0; i < 5; ++i) {
do_something(i,a+i);
}
যদি আপনার যুক্তি আরও জটিল হয় (উদাহরণস্বরূপ, আপনাকে আসলে একাধিক পরিবর্তনশীল নিরীক্ষণ করতে হবে), আমি একটি while
লুপ ব্যবহার করব ।
int main(){
int i=0;
int a=0;
for(i;i<5;i++,a++){
printf("%d %d\n",a,i);
}
}
i
এবং a
স্থানীয় করার বিষয়টি কী?
গণিত ব্যবহার করুন। দুটি অপারেশন যদি গাণিতিকভাবে লুপের পুনরাবৃত্তির উপর নির্ভর করে তবে কেন গণিত হবে না?
int i, j;//That have some meaningful values in them?
for( int counter = 0; counter < count_max; ++counter )
do_something (counter+i, counter+j);
বা আরও সুনির্দিষ্টভাবে ওপি-র উদাহরণ উল্লেখ করে:
for(int i = 0; i != 5; ++i)
do_something(i, j+i);
বিশেষত যদি আপনি মূল্য অনুসারে কোনও ফাংশনে যাচ্ছেন তবে আপনার এমন কিছু পাওয়া উচিত যা আপনি যা চান ঠিক তেমন করে।