সি ++ এ "->" অপারেটরটি কী?


8919

পড়ার পর লুকায়িত বৈশিষ্ট্য এবং সি ++ / STL এর গাঢ় কোণে উপর comp.lang.c++.moderated, আমি সম্পূর্ণরূপে বিস্মিত নিম্নলিখিত স্নিপেট কম্পাইল এবং ভিসুয়াল স্টুডিও 2008 এবং জি ++, 4.4 উভয় কাজ করেন।

কোডটি এখানে:

#include <stdio.h>
int main()
{
    int x = 10;
    while (x --> 0) // x goes to 0
    {
        printf("%d ", x);
    }
}

আউটপুট:

9 8 7 6 5 4 3 2 1 0

আমি ধরে নেব এটি সি, কারণ এটি জিসিসিতেও কাজ করে। এটি স্ট্যান্ডার্ডে সংজ্ঞায়িত কোথায়, এবং কোথা থেকে এসেছে?


501
অথবা এমনকি কেবলমাত্র যথাযথ ব্যবধানও ... আমার মনে হয় না আমি ভেরিয়েবলের মধ্যে এবং এর আগে ++বা এর --আগেও কখনও কোনও স্থান দেখেছি ...
ম্যাথু শার্লে

1153
এটি "যান" অপারেটরটি আবার ফিরে যেতে পারে (0 <- x)। এবং অপারেটর (0 <---- x) এর "রান টু" রয়েছে। গীজ, প্রশ্নের জন্য আমি কখনও সি ++ সিনট্যাক্স =) +1 শুনেছি iest
স্যাডসিডো

233
মজাদারভাবে যথেষ্ট, যদিও ব্যাখ্যাটি খুব ভুল, এটি কোডটি সঠিকভাবে কী করে তা বর্ণনা করে। :)
নলডোরিন

810
নতুন সিনট্যাক্স সম্ভাবনাগুলি কল্পনা করুন: #define upto ++<, #define downto -->। যদি আপনি খারাপ অনুভব করেন তবে আপনি করতে পারেন #define for while(এবং #define do ) {(এবং #define done ;}) এবং for x downto 0 do printf("%d\n", x) doneওহ, মানবতা লিখতে পারেন ...
ক্রিস লুৎজ

98
কোডিংয়ের পুরো নতুন এক্সপ্রেটিভ উপায়ের সম্ভাবনাটি খোলে, এর জন্য কয়েকটি সংকলক সতর্কবার্তা বলিদানের জন্য মূল্যবান: বুল চেকনিজেটিভ (ইনট এক্স) {রিটার্ন x <0? সত্য মিথ্যা ); }
tt

উত্তর:


8594

-->অপারেটর নয়। এটি আসলে দুটি পৃথক অপারেটর, --এবং >

শর্তসাপেক্ষ কোডটি হ্রাস পায় x, আসলটির xমূল (হ্রাস না হওয়া) মানটি ফেরত দেওয়ার পরে এবং তারপরে অপারেটরটি 0ব্যবহারের সাথে মূল মানটির তুলনা করে >

আরও ভালভাবে বোঝার জন্য, বিবৃতিটি নীচে লেখা যেতে পারে:

while( (x--) > 0 )

262
তারপরে আবার এটি কিছু প্রকারের রেঞ্জ অপারেটরের মত প্রসঙ্গে।
চার্লস সালভিয়া

109
এক্স পোস্ট-হ্রাস এবং তারপরে 0 এর সাথে তুলনা করে x বলার সমান হ'ল 0
চার্লস সালভিয়া

8
আমি মনে করি না এটি এক রকম। আমি মনে করি "তখন" শব্দের দ্বারা বোঝা যাচ্ছে একটি আদেশ রয়েছে (পোস্ট হ্রাসের পরে, এক্স এর মান আরও কম)। আমি মনে করি যে কেউ এটি স্পষ্ট করে তুলতে "আপনি কমিয়ে x পোস্ট করছেন এবং তার পুরাতন মান এবং 0 ..." এর সাথে তুলনা করতে পারেন। তবে এটি যাইহোক নিটপিক করছে। আমরা সবাই জানি কী বোঝাতে চাইছে।
জোহানেস স্কাউব - লিটব

38
জাভাতে এটিও সংকলন করে :)
স্টিভেন দেভিজেভার

44
এর নাম, @ জায়েজ, খারাপ প্রোগ্রামিং শৈলী :-) এটি প্রথম থেকেই প্রশ্ন জিজ্ঞাসা করা হয়েছিল তার দ্বারা প্রমাণিত হয়। অপারেটরদের অপ্রাসঙ্গিক কিছু না করে বরং তারা যে জিনিসটি চালাচ্ছে সেটিকে টেক্সটিক্যালি টেক্সটলে বেঁধে রাখার ফলে while (x-- > 0)এটি আরও কার্যকর হবে more এটি আরও স্পষ্ট করে তোলে যে কি চলছে (কমপক্ষে একটি ফিক্সড ফন্ট সম্পাদকে) এর অর্থ এই যে উত্তরটির প্রথম বন্ধনীর প্রয়োজন হবে না।
প্যাক্সিডিয়াবলো

3129

বা সম্পূর্ণ আলাদা xকিছুর জন্য ... স্লাইডগুলি 0

while (x --\
            \
             \
              \
               > 0)
     printf("%d ", x);

গাণিতিক তেমন নয়, তবে ... প্রতিটি চিত্র হাজার শব্দ ব্যবহার করে ...


216
@ মফুট্র্যাক্ট - যেমনটি আমার মনে আছে C সি তে কেবল পরের লাইনে সংযোজন করা হয়েছে যেন লাইন ব্রেক নেই break মূলত এখানে কিছুই করা যায় না।
হোগান

2
@ মাফু '\' অক্ষরটি সংকলককে বলে যে বর্তমান লাইনটি পরবর্তী লাইনে অবিরত থাকে এবং তাই সংকলককে উভয় লাইন একত্রিত করে এক হিসাবে সংকলন করা উচিত। 'যখন (x -> 0)' এক্স -1 এর সমান না হওয়া পর্যন্ত চলবে। তবে, তিনি যেভাবে ইনডেন্টেশনগুলি তৈরি করেন তা এটিকে দেখতে দেখতে শূন্যের দিকে স্লাইড হয়ে যাচ্ছে x 'এক্স স্লাইডে 0 এ ...'
ফ্লিপ

16
আইআইআরসি, কেএন্ডআর সি হ্রাস অপারেটরের মধ্যে 'এর মধ্যে শ্বেত স্পেসের অনুমতি দিয়েছে, এক্ষেত্রে আপনি এর মাঝখানে ব্যাকস্ল্যাশ থাকতে পারেন, যা দেখতে শীতলও লাগবে। :)
জুলে

10
@ অর্ণববোরবোর এটি একটি পুরানো অভিব্যক্তি why waste words when a picture does a better job, যা এই প্রসঙ্গে একটি রসিকতা হিসাবে ব্যবহৃত হয়েছে। (সেখানে আসলে 2 কীওয়ার্ড হয় whileএবং printf)
unsynchronized

87
হ্যাঁ, অস্পষ্ট স্লাইড অপারেটর। আমি কিভাবে ভুলতে পারি!
demkoryu

2377

এটি একটি খুব জটিল অপারেটর, সুতরাং আইএসও / আইইসি জেটিসি 1 (জয়েন্ট টেকনিকাল কমিটি 1) এর বর্ণনাটি সি ++ স্ট্যান্ডার্ডের দুটি পৃথক অংশে রেখেছিল।

একদিকে তাকাতে , তারা দুটি পৃথক অপারেটর: --এবং >যথাক্রমে +5.2.6 / 2 এবং C ++ 03 স্ট্যান্ডার্ডের §5.9 এ বর্ণিত।


1277

এর সমতুল্য

while (x-- > 0)

x--(পোস্ট হ্রাস) এর সমান x = x-1, কোডটি এতে রূপান্তর করে:

while(x > 0) {
    x = x-1;
    // logic
}
x--;   // The post decrement done when x <= 0

15
এটি মোটেই ঠিক নয়। লুপের দেহের অভ্যন্তরে x এর মান দ্বিতীয় ক্ষেত্রে পৃথক। আপনার উদাহরণে অ্যাসাইনমেন্ট স্টেটমেন্টটি সমতুল্য হওয়ার জন্য যুক্তির উপরে হওয়া উচিত । পোস্টফিক্স - 1 টি বিয়োগ করে তবে বিয়োগের আগে থেকেই মানটির সাথে তুলনাটি ঘটবে ।
uliwitness

4
@ উত্তর সাক্ষী এগুলি সত্যই সমতুল্য। উপসর্গটি ব্যবহার করা হলে এটি ভুল হবে: 0 >-- xএই ক্ষেত্রে xযুক্তির আগে হ্রাস করা হয়। পোস্টফিক্সে, যুক্তি হ্রাসের আগেই কার্যকর করা হয় এবং সুতরাং উভয় নমুনা সমান equivalent এগুলিতে একটি লিখতে Consoleএবং তাদের পরীক্ষা নির্দ্বিধায় ।
এমা

12
তারা এখনও সমতুল্য নয়। প্রথম লুপের পরে, x হ'ল -1 (বা স্বাক্ষরিত না হয়ে থাকলে ওভারফ্লাউন হয়েছে), দ্বিতীয়টির পরে এটি 0 হয় (ধরে নেওয়া যে এক্সটি অ-নেগেটিভ থেকে শুরু হয়, লুপটি এক্স বা বিরতি বা…) পরিবর্তন করে না
সিজার

1
while(x=x-1,x+1 > 0)সমতুল্য
এসএস আন

2
@ সাহেবহ্যাম, এখানে একটি পাল্টা উদাহরণ রয়েছে: যদি x 0 হিসাবে শুরু হয় তবে মূল লুপের অধীনে এটি -1 হিসাবে প্রস্থান করবে, আপনার সংস্করণ সহ এটি শূন্য থাকবে। সুতরাং তারা সমতুল্য না।
এলিয়ট

1207

x বিপরীত দিক থেকে শূন্যে আরও দ্রুত যেতে পারে:

int x = 10;

while( 0 <---- x )
{
   printf("%d ", x);
}

8 6 4 2

আপনি একটি তীর দিয়ে গতি নিয়ন্ত্রণ করতে পারেন!

int x = 100;

while( 0 <-------------------- x )
{
   printf("%d ", x);
}

90 80 70 60 50 40 30 20 10

;)


6
কোন অপারেটিং সিস্টেম, এই ধরণের আউটপুট উত্পন্ন হয়েছিল, আমি একটি উবুন্টু ব্যবহার করছি 12.04 এতে আমার একটি ত্রুটি বার্তা ছিল
ভুবনেশ

74
যদিও এটি স্পষ্ট হওয়া উচিত, সি ++ তে নতুন প্রত্যেকের কাছে এটি পড়া: এটি করবেন না। আপনার যদি একাধিকের বর্ধিত / হ্রাস প্রয়োজন হয় তবে কেবলমাত্র অগমেন্টেড অ্যাসাইনমেন্টটি ব্যবহার করুন।
ব্লিমিও

263
"লেজারগুলি" সহ জিরো। (0> - - - - - - - - ---------- এক্স) ... একই আউটপুট।
স্যামুয়েল ড্যানিয়েলসন

4
@ ফোর্ড আপনি কি নিশ্চিত যে এটি সংকলন করে না? -> coliru.stacked-crooked.com/a/5aa89a65e3a86c98
ডক

18
@ ডক এটি সি ++ তে সংকলন করে তবে সি তে নয়।
ফোর্ড

548

এটা

#include <stdio.h>
int main(void){
     int x = 10;

     while( x-- > 0 ){ // x goes to 0

       printf("%d ", x);
     }

     return 0;
}

কেবল স্থানটি জিনিসগুলিকে মজাদার, --হ্রাস এবং >তুলনা দেখায় ।


431

এর ব্যবহারের -->historicalতিহাসিক প্রাসঙ্গিকতা রয়েছে। হ্রাস হ্রাস ছিল (এবং এখনও কিছু ক্ষেত্রে রয়েছে), x86 আর্কিটেকচারে বাড়ানোর চেয়ে দ্রুত। -->যে পরামর্শগুলি xচলছে সেগুলি ব্যবহার করে 0এবং গাণিতিক পটভূমি রয়েছে তাদের কাছে আবেদন করে।


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

25
ঠিক আছে, শূন্যের দিকে হ্রাস করার অর্থ আপনাকে কেবল প্রতি লুপ পুনরাবৃত্তির সাথে 0 এর সাথে তুলনা করতে হবে, যখন এন এর দিকে পুনরাবৃত্তি করার অর্থ এন এর প্রতিটি পুনরাবৃত্তির সাথে তুলনা করা। পূর্ববর্তীটি আরও সহজ হতে থাকে (এবং কিছু আর্কিটেকচারে, প্রতিটি ডেটা রেজিস্টার অপারেশনের পরে স্বয়ংক্রিয়ভাবে পরীক্ষা করা হয়)।
জোয় অ্যাডামস

9
@ বুরিটো যদিও আমি একমত নই, তবে শূন্য-বহির্ভুত মানগুলিতে শর্তযুক্ত লুপগুলি সাধারণত নিখুঁতভাবে পূর্বাভাস দেয়।
ডানকান

14
বৃদ্ধি এবং হ্রাস সমান দ্রুত, সম্ভবত সমস্ত প্ল্যাটফর্মগুলিতে (অবশ্যই x86 এ)। পার্থক্যটি লুপ শেষের শর্তটি পরীক্ষা করার ক্ষেত্রে। কাউন্টারটি শূন্যে পৌঁছেছে কিনা তা ব্যবহারিকভাবে মুক্ত কিনা তা দেখার জন্য - যখন আপনি কোনও মান হ্রাস করেন, তখন একটি শূন্য পতাকাটি প্রসেসরে সেট করা থাকে এবং শেষ শর্তটি সনাক্ত করতে আপনাকে কেবল সেই পতাকাটি পরীক্ষা করতে হবে যখন আপনি বাড়ানোর সময় শেষ শর্তের আগে একটি তুলনা অপারেশন প্রয়োজন সনাক্ত করা যেতে পারে।
লেগো

7
অবশ্যই, আজকাল এই সমস্তগুলি চূড়ান্ত, যেহেতু আধুনিক সংকলকগণ স্বয়ংক্রিয়ভাবে লুপগুলি ভেক্টরাইজ এবং বিপরীত করতে পারে।
লাম্বদা পরী


362

পুরোপুরি গীক, তবে আমি এটি ব্যবহার করব:

#define as ;while

int main(int argc, char* argv[])
{
    int n = atoi(argv[1]);
    do printf("n is %d\n", n) as ( n --> 0);
    return 0;
}

17
@ এসএফএক্স - এটি ইজিপ্টিয়ান বন্ধনীগুলির
মউভিচেল

1
এটি সংকলন করে না। সি পাস্কাল নয়, যেখানে অভ্যন্তরটি do ... whileএকটি বিবৃতি তালিকা। সি তে এটি একটি ব্লক, সুতরাং এটি অবশ্যই হবে do { ... } while
ব্যবহারকারী 207421

25
@ ইজেপি এটি সংকলন করে। বাক্য গঠনটি হ'ল do statement while ( expression ) ;। এটি বলার পরে, আমি আশা করি এটি বোঝা গেছে বোঝার জন্য আমি উদাহরণটিকে রসিকতা হিসাবে বোঝাতে চাইছি।
ইস্কুয়ালো

321

আমি যে একটি বই পড়েছি (কোন বইটি সঠিকভাবে মনে নেই) বলেছে: সংকলকগণ বাম ডান নিয়মটি ব্যবহার করে বৃহত্তম টোকেনে এক্সপ্রেশনগুলি পার্স করার চেষ্টা করেন

এই ক্ষেত্রে, অভিব্যক্তি:

x-->0

বৃহত্তম টোকেনগুলিতে পার্স:

token 1: x
token 2: --
token 3: >
token 4: 0
conclude: x-- > 0

একই নিয়মটি এই অভিব্যক্তিতে প্রযোজ্য:

a-----b

পার্স করার পরে:

token 1: a
token 2: --
token 3: --
token 4: -
token 5: b
conclude: (a--)-- - b

আমি আশা করি এটি জটিল ভাবটি বুঝতে সহায়তা করে ^^


98
আপনার দ্বিতীয় ব্যাখ্যাটি সঠিক নয়। সংকলকটি দেখতে a-----bএবং চিন্তা করবে (a--)-- - b, যা সংকলন a--করে না কারণ একটি মূল্য মূল্য দেয় না।
টিম লিফ

22
অতিরিক্তভাবে, xএবং --দুটি পৃথক টোকেন হয়।
রোল্যান্ড ইলিগ

23
@ ডক্টরটি: এটি লেক্সারকে পাস করে। কেবল তাত্পর্যপূর্ণ পাসটি সেই ত্রুটিটি অনুকরণ করতে সক্ষম। সুতরাং তার ব্যাখ্যা সঠিক।
v.oddou

9
যতক্ষণ আপনি মনে করেন -->একজন অপারেটর (যা জিজ্ঞাসিত প্রশ্নটি দ্বারা বোঝানো হয়েছে), এই উত্তরটি মোটেই সহায়ক নয় - আপনি ভাবেন টোকন 2 কেবলমাত্র -->নয় --। আপনি যদি জানেন যে -->এটি কোনও অপারেটর নয়, আপনার সম্ভবত প্রশ্নটির কোড বোঝার কোনও সমস্যা নেই, সুতরাং আপনার যদি সম্পূর্ণ ভিন্ন প্রশ্ন না আসে তবে আমি কীভাবে এটি কার্যকর হতে পারি তা নিশ্চিত sure
বার্নহার্ড বার্কার

4
@ ডক্টর টি উদাহরণটি ধরে নেওয়া সঠিক হতে পারে যে aপোস্ট-হ্রাসের অপারেটরটি ওভারলোড হয়েছে, যেটি মূল্য দেয়। coliru.stacked-crooked.com/a/e1effc351ae79e9f
ডক

275

এটি ঠিক একই রকম

while (x--)
{
   printf("%d ", x);
}

অ-নেতিবাচক সংখ্যাগুলির জন্য


153
এই হওয়া উচিত নয় for(--x++;--x;++x--)?
মতিন উলহাক

9
@ ডক্টরটি এটির unsignedজন্য
কোল জনসন

12
@ মাটেন উলহাক, মান অনুযায়ী ভুল যে এক্সপ্রেশনটি --x++§1.9.15 অনুসারে আচরণের অপরিজ্ঞাত আচরণ করেছে
ওয়ার্ল্ডসেন্ডার

যদি এটি ব্যবহার করা হত তবে এটি ব্যবহার unsignedকরত%u
Cacahuete Frito

242

যাইহোক, আমাদের এখন অপারেটর একটি "যাও" আছে। "-->"দিক হিসাবে স্মরণ রাখা সহজ, এবং "যখন এক্স শূন্যে যায়" অর্থ-সোজা।

তদতিরিক্ত, এটি "for (x = 10; x > 0; x --)"কিছু প্ল্যাটফর্মের চেয়ে কিছুটা বেশি দক্ষ ।


17
এক্স এর মান negativeণাত্মক হলে বিশেষত যখন কথা বলতে পারা যায় না।
গণেশ গোপালসুব্রাহ্মণিয়ামিয়ান

15
অন্যান্য সংস্করণ একই কাজ করে না - for (size_t x=10; x-->0; )লুপের বডি সহ 9,8, .., 0 দিয়ে মৃত্যুদন্ড কার্যকর করা হয় অন্য সংস্করণে 10,9, .., 1 রয়েছে। অন্যথায় স্বাক্ষরযুক্ত ভেরিয়েবলের সাথে শূন্যের নিচে লুপ থেকে বেরিয়ে আসা বেশ কঠিন।
পিট কির্খাম

4
আমি মনে করি এটি কিছুটা বিভ্রান্তিমূলক ... ++>ক্রমবর্ধমান কাজ করার জন্য আমাদের আরেকটি প্রয়োজন, যেহেতু আমাদের আক্ষরিক অর্থে "অপারেটর" নেই ।
tslmy

19
@ জোশ: আসলে, ওভারফ্লো এর জন্য অপরিজ্ঞাত আচরণ দেয় int, তাই এটি আপনার কুকুরটিকে সহজেই খেতে xপারে যদি এটি নেতিবাচক শুরু হয় তবে শূন্যের দিকে নিতে পারে।
SamB

3
@ পেটকিরখামের কমেন্টে প্রদত্ত কারণে এটি আমার কাছে একটি অত্যন্ত গুরুত্বপূর্ণ প্রতিমা, কারণ আমাকে প্রায়শই স্বাক্ষরযুক্ত স্বল্প পরিমাণে লুপগুলি হ্রাস করতে হবে 0। (তুলনা করার জন্য, শূন্যের জন্য পরীক্ষাগুলি বাদ দেওয়ার মূর্খতা, যেমন while (n--)স্বাক্ষরবিহীন পরিবর্তে লেখার জন্য n, আপনাকে কিছুই কিনে না এবং আমার জন্য পঠনযোগ্যতাকে প্রচুর পরিমাণে বাধাগ্রস্ত করে)) এটির মনোরম সম্পত্তিও রয়েছে যা আপনি প্রাথমিক সূচকের চেয়ে আরও একটি নির্দিষ্ট করেছেন , যা সাধারণত আপনি চান (উদাহরণস্বরূপ, কোনও অ্যারের উপরে লুপের জন্য আপনি এর আকার নির্দিষ্ট করেছেন)। আমি -->স্থান ছাড়াই পছন্দ করি , কারণ এটি আইডিয়ামটি চিনতে সহজ করে তোলে।
মার্ক ভ্যান লিউউইন

221

এই কোডটি প্রথমে x এবং 0 এর সাথে তুলনা করে এবং পরে x হ্রাস করে। (প্রথম উত্তরে এটিও বলেছেন: আপনি পোস্ট-হ্রাস x এবং তারপরে >অপারেটরের সাথে x এবং 0 এর তুলনা করছেন )) এই কোডটির আউটপুট দেখুন:

9 8 7 6 5 4 3 2 1 0

আমরা এখন প্রথমে তুলনা করি এবং তারপরে আউটপুটে 0 দেখে হ্রাস পাচ্ছি।

যদি আমরা প্রথমে হ্রাস করতে এবং তারপরে তুলনা করতে চাই তবে এই কোডটি ব্যবহার করুন:

#include <stdio.h>
int main(void)
{
    int x = 10;

    while( --x> 0 ) // x goes to 0
    {
        printf("%d ", x);
    }
    return 0;
}

এই আউটপুটটি হ'ল:

9 8 7 6 5 4 3 2 1

177

আমার সংকলক 9876543210 মুদ্রণ করবে যখন আমি এই কোডটি চালাই।

#include <iostream>
int main()
{
    int x = 10;

    while( x --> 0 ) // x goes to 0
    {
        std::cout << x;
    }
}

প্রত্যাশিত. while( x-- > 0 )আসলে মানে while( x > 0)x--পোস্ট decrements x

while( x > 0 ) 
{
    x--;
    std::cout << x;
}

একই জিনিস লেখার একটি ভিন্ন উপায়।

এটি দুর্দান্ত যদিও মূলটি "যদিও x 0 তে যায়" তেমন দেখাচ্ছে।


4
ফলাফলটি কেবল তখনই সংজ্ঞায়িত হয় যখন আপনি একই বিবৃতিতে একাধিকবার একই ভেরিয়েবলকে বাড়িয়ে / কমিয়ে আনছেন। এটি এই পরিস্থিতিতে প্রযোজ্য নয়।
টিম লিফ

13
while( x-- > 0 ) actually means while( x > 0)- আমি নিশ্চিত না যে আপনি সেখানে কী বলার চেষ্টা করছেন, তবে আপনি যেভাবে এটি উচ্চারণ করেছেন তা বোঝায় যে --এর কোনও অর্থ নেই যা স্পষ্টতই খুব ভুল।
বার্নহার্ড বার্কার

@Dukeling থেকে বিন্দু ফেরার আকুতি, এই উত্তর একই নয় আসল পোস্ট হিসাবে। মূল পোস্টে, xহতে হবে -1পরে এটি লুপ ছেড়ে যখন এই উত্তরে xহতে হবে 0
লাকাতা

148

একটা স্থান মধ্যে অনুপস্থিত --এবং >xঅবস্থা হ্রাসের পরে পোস্ট হ্রাস, অর্থাৎ হ্রাস পেয়েছে x>0 ?


42
স্থান অনুপস্থিত - সি (++) সাদা স্থান উপেক্ষা করে।

27
@ H2CO3- এ সাধারণভাবে সত্য নয়। যেখানে সাদা স্থান পৃথক টোকেন থেকে ব্যবহার করা আবশ্যক, যেমন আছেন #define foo()বনাম #define foo ()
জেনস 21

30
@ জেনস কীভাবে: "স্থানটি অনুপস্থিত - সি (++) অপ্রয়োজনীয় সাদা স্থান উপেক্ষা করে?"
কেভিন পি। রাইস

139

--হয় হ্রাস অপারেটর এবং >হয় বৃহত্তর-তুলনায় অপারেটর।

দুটি অপারেটর একক হিসাবে এক হিসাবে প্রয়োগ করা হয় -->


11
তারা তারা 2 পৃথক অপারেটর হিসাবে প্রয়োগ করা হয়। এগুলি কেবল "একক একটি" এর মতো দেখতে বিভ্রান্তিকরভাবে লেখা হয়েছে।
আন্ডারস্কোর_২

129

এটি দুটি অপারেটরের সংমিশ্রণ। প্রথমটি --মান হ্রাস করার জন্য, এবং >এটি ডান-হাতের অপারেন্ডের চেয়ে মান বেশি কিনা তা যাচাইয়ের জন্য।

#include<stdio.h>

int main()
{
    int x = 10;

    while (x-- > 0)
        printf("%d ",x);

    return 0;
}

আউটপুটটি হবে:

9 8 7 6 5 4 3 2 1 0            

122

আসলে, xপোস্ট-হ্রাসকারী এবং সেই শর্তটি পরীক্ষা করা হচ্ছে। এটা না -->, এটা(x--) > 0

দ্রষ্টব্য: xশর্তটি পরীক্ষা করার পরে এর মান পরিবর্তন করা হয়, কারণ এটি পরে-হ্রাসের পরে। কিছু অনুরূপ ক্ষেত্রেও ঘটতে পারে, উদাহরণস্বরূপ:

-->    x-->0
++>    x++>0
-->=   x-->=0
++>=   x++>=0

6
++> ব্যতীত অল্প সময়ে () ব্যবহার করা যেতে পারে। একটি "উপরে যায় ..." অপারেটরটি হবে ++ <, যা কোথাও দেখতে সুন্দর লাগে না। অপারেটর -> একটি খুশির কাকতালীয়।
ফ্লোরিয়ান এফ

2
@ বেনলেগিগেরো কোড তৈরির অনুভূতিতে এটি 'কাজ' করতে পারে যা এমন কিছু করে (যা পাঠকদের ভ্রান্ত-চতুর কোড পছন্দ করে না তাদের বিভ্রান্ত করার সময়), তবে শব্দার্থবিজ্ঞানগুলি ভিন্ন, কারণ এর পূর্বনির্ধারিত ব্যবহারের অর্থ এটি আরও কম পুনরাবৃত্তিকে কার্যকর করবে। একটি স্বীকৃত উদাহরণ হিসাবে, এটি x1 থেকে শুরু করা লুপের বডিটি কখনই কার্যকর করবে না , তবে while ( (x--) > 0 )করবে। {সম্পাদনা করুন} এরিক লিপার্ট তার সি # 4 রিলিজ নোটগুলিতে উভয়টিই কভার করেছেন: ব্লগস.এমএসডিএন.মাইক্রোসফট
আন্ডারস্কোর_২

120

সি এবং সি ++ "সর্বাধিক মাম্প" নিয়ম মানেন। (a--) - bআপনার ক্ষেত্রে একইভাবে a --- খ x-->0অনুবাদ করা হয়েছে (x--)>0

বিধিটি মূলত যা বলে তা হ'ল বাম থেকে ডানে যাওয়া, সর্বাধিক অক্ষর গ্রহণের মাধ্যমে অভিব্যক্তি তৈরি হয় যা একটি বৈধ ভাব প্রকাশ করবে।


5
ওপি যা অনুমান করেছিল: "((ক) ->)" ছিল সর্বাধিক মঞ্চ। দেখা যাচ্ছে যে ওপির মূল অনুমানটি ভুল ছিল: "->" কোনও সর্বাধিক বৈধ অপারেটর নয়।
ডেভিড

4
লোভী পার্সিং নামেও পরিচিত, যদি আমি সঠিকভাবে স্মরণ করি।
রায় টিঙ্কার

1
@ রয়টাইঙ্কার লোভী স্ক্যানিং। এর সাথে পার্সারের কোনও সম্পর্ক নেই।
ব্যবহারকারী 207421

27

এত জটিলতা কেন?

মূল প্রশ্নের সহজ উত্তরটি কেবল:

#include <stdio.h>
int main()
{
    int x = 10;
    while (x > 0) 
    {
        printf("%d ", x);
        x = x-1;
    }
}

একই জিনিস। আপনার এইরকমটি করা উচিত নয় বলছেন, তবে এটি একই কাজ করে এবং একটি পোস্টে প্রশ্নের উত্তর দিয়ে দিত।

x--উপরেরটির জন্য এটি কেবল সংক্ষিপ্ত , এবং >কেবলমাত্র একটি সাধারণের চেয়ে বড়operator । বড় রহস্য নেই!

আজকাল প্রচুর লোকেরা সহজ জিনিসকে জটিল করে তোলে;)


17
এই প্রশ্নের নয় জটিলতা সম্পর্কে কিন্তু ** সম্পর্কে লুকায়িত বৈশিষ্ট্য এবং C- এর গাঢ় কোণে ++, / STL **
, pix

20
এখানে প্রোগ্রামটি মূলের চেয়ে আলাদা আউটপুট দেয় কারণ x এখানে প্রিন্টফের পরে হ্রাস পেয়েছে। এটি "সহজ উত্তরগুলি" কীভাবে সাধারণত ভুল হয় তা ভালভাবে প্রমাণ করে।
Öö তিবি

2
The OP's way: 9 8 7 6 5 4 3 2 1 0এবংThe Garry_G way: 10 9 8 7 6 5 4 3 2 1
অ্যান্টনি

2
এটি একই জিনিস না। আপনার x=x-1আগে সরান printfতারপরে আপনি বলতে পারেন "এটি একই কাজ করে"।
সিআইটিবিএল

26

প্রচলিত উপায়ে আমরা whileলুপ বন্ধনীতে ()একটি শর্ত এবং বন্ধনীগুলির ভিতরে একটি অবসান শর্তকে সংজ্ঞায়িত করব {}তবে--> সংজ্ঞায়িত করব উভয়কে একবারে সংজ্ঞায়িত করব।

উদাহরণ স্বরূপ:

int abc(void)
{
    int a = 5
    while((a--) > 0) // Decrement and comparison both at once
    {
        // Code
    }
}

এটি হ্রাস করে aএবং লুপটি চালিত করে যখন aএর চেয়ে বেশি হয়0

প্রচলিতভাবে এটির মতো হবে:

int abc(void)
{
    int a = 5;
    while(a > 0)
    {
        a--;
        // Code
    }
    a--;
}

উভয় উপায়ে, আমরা একই জিনিস করি এবং একই লক্ষ্য অর্জন করি।


5
এটি ভুল। প্রশ্নের কোডটি করে: 'টেস্ট-রাইটিং-এক্সিকিউট' (পরীক্ষার আগে নতুন মান লিখুন, লুপটি কার্যকর করুন), আপনার উদাহরণটি হ'ল টেস্ট-এক্সিকিউট-লিখন '।
v010dya

@ v010dya উত্তর স্থির করে, এখন এটি test-write-executeপ্রশ্নের মতোই, নির্দেশের জন্য ধন্যবাদ!
কোটাউস্কাস

@ ভ্লাদিস্লাভ টনচারভ আপনার সম্পাদনা এখনও ভুল ছিল। আমার দেখুন।
এসএস আন

8

(x --> 0) মানে (x-- > 0)

  1. তুমি ব্যবহার করতে পার (x -->)
    output -: 9 8 7 6 5 4 3 2 1 0

  2. আপনি ব্যবহার করতে পারেন (-- x > 0) এটার মানে(--x > 0)
    output -: 9 8 7 6 5 4 3 2 1

  3. তুমি ব্যবহার করতে পার
(--\
    \
     x > 0)

output -: 9 8 7 6 5 4 3 2 1

  1. তুমি ব্যবহার করতে পার
(\
  \
   x --> 0)

output -: 9 8 7 6 5 4 3 2 1 0

  1. তুমি ব্যবহার করতে পার
(\
  \
   x --> 0
          \
           \
            )

output -: 9 8 7 6 5 4 3 2 1 0

  1. আপনি ব্যবহার করতে পারেন
(
 x 
  --> 
      0
       )

output -: 9 8 7 6 5 4 3 2 1 0

একইভাবে, আপনি এই কমান্ডটি সফলভাবে সম্পাদন করতে প্রচুর পদ্ধতিতে চেষ্টা করতে পারেন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.