সি আই বিকাশকারীদের এত কৌতূহলী করে তোলে যদি "আমি ++ == ++ আমি"? [বন্ধ]


15

কেবল একটি এলোমেলো পর্যবেক্ষণ, মনে হচ্ছে স্ট্যাকওভারফ্লো.কম এ "++ i == i ++" থাকলে প্রশ্ন রয়েছে। এই প্রশ্নটি সর্বদা জিজ্ঞাসা করা হয় যদিও আমি মনে করি এটি গত 2 মাসে প্রায় 6 বা 7 বার জিজ্ঞাসা করেছি।

আমি শুধু ভাবছি কেন সি বিকাশকারীরা এতে এত আগ্রহী? একই ধারণা / প্রশ্নটি সি # এবং জাভা ডিভাসগুলির জন্যও বিদ্যমান, তবে আমি মনে করি যে আমি কেবল একটি সি # সম্পর্কিত প্রশ্ন দেখেছি।

এতগুলি উদাহরণ ++ i ব্যবহার করার কারণে এটি কি? এটি কিছু জনপ্রিয় বই বা টিউটোরিয়াল থাকার কারণে? এটি কি কারণ সি বিকাশকারীরা কেবল 'দক্ষতা' / 'পারফরম্যান্স' এর জন্য একক লাইনে যতটা সম্ভব ক্র্যাম করতে পছন্দ করেন এবং তাই প্রায়শই ++ অপারেটরটি ব্যবহার করে 'অদ্ভুত' কনস্ট্রাক্টের মুখোমুখি হন?


23
(আমার কাছে সি # ডেভ হিসাবে, আমি ++ এবং ++ আমি সমান I এর মধ্যে, তবে সি # ডেভ হিসাবে আমি একটি বা দুটি ঘড়ির চক্র সংরক্ষণ করার চেষ্টা করছি না কারণ আমি যেভাবেই ইতিমধ্যে তুলনামূলকভাবে অক্ষম)
মাইকেল স্টাম

1
উদীয়মান প্রোগ্রামার হিসাবে আমরা পাটিগণিত, যুক্তি দিয়ে খেলতে পছন্দ করি এবং কীভাবে কাজ হয় তা আগ্রহী। আমি মনে করি যে এই জাতীয় প্রশ্নগুলিকে আমরা পছন্দ করি a এটি কোনও পথব্যবস্থা বৈশিষ্ট্য নাও হতে পারে তবে এটি আকর্ষণীয়! এজন্য না যে কারণে আমরা প্রথম স্থানে প্রোগ্রামার হয়ে গেলাম ?!
চানি

2
আপনি আক্ষরিক অভিব্যক্তি উল্লেখ করা হয় ++i == i++মধ্যে অর্থ মধ্যে পার্থক্য সম্পর্কে, অথবা আরো সাধারণভাবে ++iএবং i++?
কিথ থম্পসন

উত্তর:


30

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

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


14
এটি কি চিরন্তন সেপ্টেম্বরের বিপরীত নয় ? শাশ্বত সেপ্টেম্বর ছিল যখন এওএল তাদের গ্রাহকদের জন্য ইউজনেট অ্যাক্সেসের অফার শুরু করেছিল, এটি সেপ্টেম্বরের মতো মনে হয়েছিল (মাসের যখন নতুন শিক্ষার্থীরা traditionতিহ্যবাহীভাবে বোর্ডগুলিকে newbies বলে বোমা মেরেছে) বছরব্যাপী।
nlawalker

এটি একটি আকর্ষণীয় তত্ত্ব তবে সম্ভবত কোনও বিষয়টি যদি বুঝতে না পারে তবে এটি সবসময়ই শিক্ষকদের দোষ নয়: হতে পারে শিক্ষার্থীরা (1) ক্লাস চলাকালীন পর্যাপ্ত মনোযোগ দিচ্ছিল না এবং (2) স্ট্যাকওভারফ্লো সম্পর্কে উত্তর খোঁজার জন্য খুব অলস ছিল আবার একই প্রশ্ন জিজ্ঞাসা।
জর্জিও

12

কারণ সি প্রোগ্রামাররা অপারেশনের ক্রম বুঝতে পারে। সি # বিকাশকারীরা প্রয়োজনীয়ভাবে বিটওয়াইস অপারেটরগুলি (এবং, |, ~) বা উপসর্গ অপারেটর ব্যবহার করবেন না যেহেতু আমরা সাধারণত অন্যান্য স্টাফ নিয়ে বেশি উদ্বিগ্ন। তবে, আমরা সি # ডেভেলস যা বুঝতে পারি না তা হ'ল আমাদের জানা উচিত যে আমরা প্রতিদিন ভিত্তিতে অপারেটরগুলি কী ব্যবহার করি এবং কীভাবে সেগুলি সঠিকভাবে ব্যবহার করতে হয়। আমাদের বেশিরভাগ লোকেরা কেবল এমন জায়গাগুলি এড়িয়ে যায় যেখানে এটি সমস্যা হতে পারে।

আপনার মাথার উপরে, এই স্নিপেটের আউটপুট কি?

    double x = 5.5;
    Console.WriteLine(x++);
    x = 5.5;
    Console.WriteLine(++x);

আমি বলব যে বেশিরভাগ সিজনযুক্ত সি # ডেভস কনসোলের আউটপুট কী তা কোনও ধারণা নেই।


3
+1 টি। প্রাক- এবং পোস্ট-ফিক্স ইনক্রিমেন্ট / হ্রাস অপারেটরগুলির মধ্যে পার্থক্য জানা এই জাতীয় পরিস্থিতিতে এটি উপযুক্ত।
মাওলরাস

4
আমি বিন্দুটি দেখতে চাই এবং আমি আউটপুটটিও জানতাম না (আমি বিশ্বাস করি এটি 5.5 এবং 6.5, তবে আমি নিশ্চিত নই), এবং এটি আমার কাছে x ++ এ রিফ্যাক্টর করায় কিছু হবে না; Console.WriteLine (x) এর; অবিলম্বে। আমি তবে সম্পূর্ণ অজ্ঞ নই, আমি কেবল মনে করি এটি শূন্য ব্যবহারের সাথে একটি বড় কোড গন্ধ।
মাইকেল স্টাম

9
ক্রিয়াকলাপের ক্রম, বা উপসর্গ এবং পোস্টফিক্স ইনক্রিমেন্টের মধ্যে পার্থক্যের সাথে প্রশ্নের উত্তরের কোনও সম্পর্ক নেই। এটি সংজ্ঞায়িত এবং অপরিবর্তিত আচরণের বিষয়।
ডেভিড থর্নলি

2
আমি আজ এই মুখোমুখি। কিছু একটা if (myList[i++] == item)। চালাক। আমি এটি একটি সূচক ছাড়ার ব্যতিক্রমের উত্স সন্ধান করতে দেখেছি ... সত্যই, খুব "চালাক"।
rmac

7
আমি মনে করি এটি 5.5 এবং 6.5, তবে আমি এর আগে কখনও ++ভাসমান হিসাবে ব্যবহার করতে দেখিনি এবং আমি অবশ্যই বলব যে এটি খুব উপযুক্ত বলে মনে হচ্ছে না। মানুষ কি তা করে? (আমি পছন্দ করব += 1)
বার্ট ভ্যান হিউকেলোম

8

আমি মনে করি এটি সুস্পষ্ট। ইন সি #, একটি জন্য int i, i++ == ++iসবসময় মিথ্যা যখন++i == i++ সবসময় সত্য, নির্ভরযোগ্যভাবে এবং সবাই কে আগ্রহ দেখিয়েছে মাত্র (প্রকৃতপক্ষে শুধু এটা চালিয়ে বা) C # এর নিয়ম শেখার সহজেই এই খুঁজে পেতে পারেন।

অন্যদিকে সি এবং সি ++ এ এটি সংজ্ঞায়িতের কাছাকাছি কারণ এটি সংকলক, সম্পাদনের পরিবেশ, প্ল্যাটফর্ম ইত্যাদির উপর নির্ভর করে তাই এর উত্তর দেওয়া অনেক কঠিন প্রশ্ন, তাই প্রচুর লোকেরা এটি জিজ্ঞাসা করে।


+1 - তবে উত্তর দেওয়ার পক্ষে এটি কোনও কঠিন প্রশ্ন নয়। "অপরিজ্ঞাত" একটি শব্দ। সমস্ত "এটি নির্ভর করে ..." স্টাফ এমন জিনিস যা বেশিরভাগ লোকেরা চিন্তা করে না। এমনকি যদি আপনি কেবল একটি নির্দিষ্ট প্ল্যাটফর্মের জন্যই লিখছেন তবে আপনার সামগ্রিকভাবে ভাষার জন্য সাধারণ বুদ্ধিমান ব্যবহার করা উচিত, এবং প্রাক-বর্ধনশীল এবং উত্তরোত্তর অপারেটরগুলির বেশিরভাগ ব্যবহার কয়েকটি সাধারণ আইডিয়মের অংশ।
স্টিভ 314

+1: এটি আসলে জিজ্ঞাসিত প্রশ্নের উত্তর দেয় (এটি হ'ল আপনি লাইনের মধ্যে পড়ছেন না)।
থমাস এডিং

7

এটি একটি জনপ্রিয় প্রশ্ন কারণ এটি একটি কৌশল question এটা তোলে undefined এর

উপরের লিঙ্কটি বার্জার্ন স্ট্রোস্ট্রপের হোমপৃষ্ঠায় থাকা একটি FAQ এ গেছে, যা এই প্রশ্নটিকে বিশেষভাবে সম্বোধন করে এবং কেন এই নির্মাণটি অপরিজ্ঞাত রয়েছে তা ব্যাখ্যা করে। এটি যা বলে তা হ'ল:

মূলত, সি এবং সি ++ এ, আপনি যেখানে লিখতে চান সেখানে কোনও ভেরিয়েবল দু'বার পড়লে ফলাফল অনির্ধারিত হয়।

মূল্যায়নের ক্রমটি অপরিশোধিত থাকার কারণে আরও ভাল পারফর্মিং কোড পাওয়া যায় বলে দাবি করা হয়।


5

সম্ভবত সি এর কারণে, আপনি লেখেন i++বা ++iআপনি যখন পয়েন্টার পাটিগণিত করছেন তখন এটি সত্যই গুরুত্বপূর্ণ matters সেখানে, iঅপারেশনের আগে বা পরে বাড়ানো অত্যন্ত গুরুত্বপূর্ণ হতে পারে। আমি আপনাকে একটি উদাহরণ দিচ্ছি তবে 10 বছর আগে সি লিখেছিলাম শেষবার ...

সি # তে আমি কখনই এমন পরিস্থিতি পেলাম না যে সম্পর্কে আমাকে ভাবতে হবে i++বা ++iআফাইকের কারণ হবে / যখন লুপগুলি করার জন্য, এটি আসলে কিছু যায় আসে না।


3
সি # এর পার্থক্যগুলি বোঝার জন্য এটি এখনও গুরুত্বপূর্ণ - কেবলমাত্র আপনি কেবল প্রতিটি লুপের জন্য ব্যবহার করেছেন বলে মনে হয় না এর অর্থ এই নয় যে আপনি কেবল এটিই খুঁজে পাবেন যা তারা খুঁজে পাবেন
STW

সম্পূর্ণ সত্য যে।
ম্লাদেন প্রজাদিক

3
এটি প্রশ্নের সাথে প্রাসঙ্গিক নয়। প্রশ্নটি i++এবং এর মধ্যে পার্থক্য সম্পর্কে নয় ++i, তবে তাদের একই অভিব্যক্তিতে সংযুক্ত করে।
ডেভিড থর্নলি

@ ডেভিড প্রশ্ন হচ্ছে সি প্রোগ্রামাররা কেন এটি সম্পর্কে আগ্রহী। উত্তর (এটা C # সি গুরুত্বপূর্ণ, না, তাই অনেক) সম্পূর্ণরূপে প্রাসঙ্গিক হয় "।
ফ্লোরিয়ান এফ

2

কয়েক বছর আগে আমি পড়েছিলাম যে এই অপারেটরগুলি বিপজ্জনক বলে বিবেচিত হয়েছিল তাই আমি এ সম্পর্কে আরও তথ্য খনন করার চেষ্টা করেছি। যদি সেই সময়ে স্ট্যাকওভারফ্লোটি আপ থাকত তবে আমি এটি সেখানে জিজ্ঞাসা করতাম।

এখন এটি এমন কারণ কারণ কিছু বাঁকানো লোক লুপগুলি লিখেন

while( [something] )
{
  a[++j] = ++j;
}

এখনও, আমি কী ঘটবে / হবে সে সম্পর্কে খুব বেশি নিশ্চিত নই, তবে এটি আমার কাছে সম্পূর্ণ স্পষ্ট যে একই লাইনে একাধিক ++ [ভার্] সমস্যা জিজ্ঞাসা করছে।


2
সি
tzenes

7
এর মত অ্যাসাইনমেন্টগুলি x = ++j;সি-তে ভালভাবে সংজ্ঞায়িত হয়েছে উপরেরটি অপরিজ্ঞাত হয়েছে কারণ jএকটি ইন্টারভেনিং সিকোয়েন্স পয়েন্ট ছাড়াই দুবার সংশোধিত হয়েছে।
ম্যাথু ফ্ল্যাশেন

2

দুটি কারণ।

++ i এর সঠিক প্রয়োগ হ'ল i বৃদ্ধি করা এবং তারপরে এটি ফিরিয়ে দেওয়া। I++ এর সঠিক প্রয়োগটি হ'ল বর্তমান মান, ইনক্রিমেন্ট i এবং সংরক্ষণিত মানটি ফিরিয়ে আনা। প্রতিশব্দটি গুরুত্বপূর্ণ হিসাবে এগুলি প্রয়োগ করা হয় না।

প্রশ্ন তখন হয় যখন সামঞ্জস্যের মত প্রকাশের মূল্যায়ন করার সময় সংকলকগুলি সেগুলি প্রয়োগ করে।

যদি সাম্যতা পরীক্ষাটি প্রথমে করা হয়, তবে প্রাক-উত্তরোত্তর অপারেটরগণ, আপনাকে প্রথমে বাম পাশ (এলএইচএস) এবং ডানদিকে (আরএইচএস) মূল্যায়ন করা হয় তার চেয়ে আলাদা যুক্তি লিখতে হবে, তারপরে সমতা।

এটি সমস্ত অপারেশনের ক্রম সম্পর্কিত এবং এর ফলে কোডটি একটি লিখে দেয় affects এবং খুব আশ্চর্যের বিষয় নয় যে সমস্ত ভাষা একমত হয় না।

বুনিয়াদি পরীক্ষাগুলির তালিকা এটি বিকাশকারীদের তাদের অনুমানগুলি সঠিক কিনা তা পরীক্ষা করার অনুমতি দেয় এবং সেই সাথে প্রকৃত বাস্তবায়ন ভাষার নির্দিষ্টকরণের সাথে মেলে কিনা।

পয়েন্টার, লুপ বা প্রত্যাবর্তন মানগুলির সাথে কাজ করার সময় এটি সমস্ত ধরণের প্রভাব ফেলতে পারে।


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

আপনি ভুল প্রশ্নের উত্তর দিয়েছেন। সি প্রোগ্রামাররা কেন এটি সম্পর্কে আগ্রহী তা আপনার উত্তর দেওয়া উচিত।
হুগো

আপনার দ্বিতীয় প্যারা যেভাবেই হোক ভুল (সি ++ 11 এর আগে কমপক্ষে): এর আচরণটি ++iহ'ল মানi+1 এবং কিছু সময় ব্যবহার করা, সম্ভবত তার আগে বা পরে, তবে পরবর্তী ক্রম বিন্দুর আগে, ইনক্রিমেন্টi
এমএম

@ ম্যাটম্যাকনাব - আপনি কি আমাকে এর জন্য একটি নির্দিষ্টকরণের দিকে নির্দেশ করতে পারেন, আমি যদি বিষয় বাস্তবায়নের ক্ষেত্রে পরিবর্তিত হয় তবে তা জানতে আগ্রহী হব। সিডি পিডিপি অ্যাসেমব্লিতে দুর্দান্তভাবে ম্যাপ করা সেই দিনগুলিতে, ++ আমি একটি আইএনসি নির্দেশকে ইনজেকশন দিয়েছিলাম, যখন প্রত্যয় সংস্করণে বর্ধিতকরণের পরে কোনও নির্দেশিকা ব্যবহারের জন্য একটি রেজিস্টারে মানটি অনুলিপি করতে হয়েছিল। আপনি বর্ণিত পরিবর্তনের প্রয়োজনীয়তাটি কী গঠন করেছিল?
ওয়াল্ট স্টোনবার্নার ২

2

আমি মনে করি এটি একটি সংস্কৃতি শক জিনিস।

ইতিমধ্যে নির্দেশিত হিসাবে, সি বা সি ++ তে একটি অভিব্যক্তির আচরণটি সংজ্ঞায়িত করা যেতে পারে কারণ পোস্ট-ইনক্রিমেন্ট ইত্যাদির সম্পাদনের ক্রম কঠোরভাবে সংজ্ঞায়িত হয়নি। অপরিজ্ঞাত আচরণটি সিতে বেশ সাধারণ, এবং অবশ্যই প্রচুর পরিমাণে সি ++ তে আমদানি করা হয়েছিল।

যে কারও কাছে অন্য ভাষায় কিছু প্রোগ্রামিং করা হয়েছে - যে কেউ এই ধারণাটি গ্রহণ করেছেন যে প্রোগ্রামিংয়ের ভাষাগুলি সুনির্দিষ্ট হওয়ার কথা, এবং কম্পিউটারগুলি যেগুলি তাদের বলা হচ্ছে তা করা উচিত ... ভাল, এটি একটি ধাক্কা আবিষ্কার করুন যে সি কিছু বিষয়ে ইচ্ছাকৃতভাবে অস্পষ্ট is


সি এইভাবে কারণ এটি অজানা এমবেডেড বা মেইনফ্রেম প্ল্যাটফর্মগুলি সহ আপনি ভাবতে পারেন এমনটি যখন সি # সংজ্ঞায়িত করা হয়েছিল তখনও এটির উপস্থিতি থেকে আরও বেশি প্ল্যাটফর্মকে সমর্থন করার জন্য ডিজাইন করা হয়েছিল। সি #, অন্যদিকে, ... x86 এবং 360 চলছে? এআরএমও হয়তো? আর কিছু না. এজন্য সি # আরও অনেক কিছু সংজ্ঞায়িত করতে পারে।
ডেড জিএম

++ এছাড়াও, সি পিডিপি -11 এ প্রথম নির্মিত হয়নি? কোথায় স্বয়ং-বর্ধন নির্দেশাবলী ছিল? সি "মেশিনের কাছাকাছি" থাকতে চেয়েছিল যাতে এটি নির্দেশের সেটটি কার্যকরভাবে ব্যবহার করতে পারে।
মাইক ডুনলাভে

@MikeDunlavey: না, সি এর ++এবং --অপারেটরদের পিডিপি -11, যা যখন সেই অপারেটার সি এর পূর্বসুরী ভাষা বি দেখুন ব্যবস্থা চালু হয়েছে উপস্থিত করেনি উপর ভিত্তি করে করা হয় নি cm.bell-labs.com/who/dmr/chist.html , এবং "স্বতঃবৃদ্ধি" অনুসন্ধান করুন।
কিথ থম্পসন

1

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


1
ভাল কথা, ভুলে গেছি যে ভবিষ্যদ্বাণী একটি তুলনামূলকভাবে আধুনিক ধারণা।
মাইকেল স্টাম

-1

উভয় অংশের মধ্যে পার্থক্য: পোস্ট এবং প্রিনক্রিমেন্ট এই দুইটি কোডের কোডটি প্রতিটি ভাষায় যেভাবে কাজ করা উচিত সেভাবে কাজ করছে। এই ভাষা নির্ভরতা না !!!

++i

এটি প্রাক ইনক্রিমেন্ট। কোডটির এই টুকরোটি iযেখানে ব্যবহৃত হয় সেই লাইনে মান প্রেরণের আগে প্রথমে এর মান বাড়িয়ে দেয় ।

i++

এটি পোস্ট ইনক্রিমেন্ট। কোডটির এই অংশটি এর মান iবাড়ানোর আগেই এর মান প্রদান করবেi যে লাইনে ব্যবহৃত হয় সেখানে করবে।

অন্য একটি ছোট উদাহরণে:

int main(void)
{
  int i = 0; 
  int result; 
  result = 10 + ++i; 
  printf("%d \n", result); // = 11 

  int j = 0; 
  result = 10 + j++; 
  printf("%d \n", result);// = 10
  return 0;
}

কোড কোডে কোড সহ সংকলনকারী এই কোড।

এটি অপারেটরের ওভারলোডিংয়ের অভ্যন্তরীণ বাস্তবায়নের সাথে সম্পর্কযুক্ত।

++i সরাসরি মান বৃদ্ধি করে (এবং তাই কিছুটা দ্রুত)

i++প্রথমে একটি অনুলিপি তৈরি করে যা প্রয়োজনীয় জায়গায় ফিরে আসে এবং তারপরে iভেরিয়েবলের মূল মান এক দ্বারা বাড়ানো হয়।

আমি আশা করি এটি এখন পরিষ্কার হয়ে গেছে।


তবুও এটি আসল প্রশ্নটির সমাধান করে না: সি বিকাশকারীরা অন্যদের চেয়ে কেন এ সম্পর্কে জিজ্ঞাসা করেন। অপারেটরগুলি ওপি বুঝতে পারে।
মার্টিজন পিটারস

এছাড়াও এই উত্তরটি সত্যই ভুল। ++iদ্রুত নয়, এবং i++একটি অনুলিপি তৈরি করে না। আরও, ++iসি ++ এর তুলনায় সিতে কিছুটা আলাদা আচরণ করে, অন্য ভাষার মধ্যে ছেড়ে দিন।
এমএম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.