সি, সি ++ এবং সি # তে শূন্যতার অর্থ কী?


170

" অকার্যকর " শব্দটি কোথা থেকে এসেছে এবং কেন এটিকে অকার্যকর বলা হয় সে সম্পর্কে মূলসূত্রগুলি খুঁজতে চাইছেন । প্রশ্নের উদ্দেশ্য হ'ল এমন কাউকে সহায়তা করা যার যার কোনও সি অভিজ্ঞতা নেই এবং হঠাৎ সি-ভিত্তিক কোডবাসের দিকে তাকাচ্ছেন।


2
এই প্রশ্নটি 3 টি ভাষা মিশ্রিত করে ... সেই উত্তরাধিকার প্রশ্নটি 3 টি পৃথক প্রশ্নের মধ্যে বিভক্ত করা উচিত।
স্টারগেটুর

উত্তর:


225

মূলত এর অর্থ "কিছুই নয়" বা "কোনও প্রকার নয়"

অকার্যকর 3 টি ব্যবহার করা হয়:

  1. ফাংশন যুক্তি: int myFunc(void) - ফাংশন কিছুই নেয় না।

  2. ফাংশন ফেরতের মান: void myFunc(int) - ফাংশনটি কিছুই দেয় না

  3. জেনেরিক ডেটা পয়েন্টার: void* data - 'ডেটা' অজানা প্রকারের ডেটার জন্য একটি পয়েন্টার, এবং এটি অবহেলা করা যায় না

দ্রষ্টব্য: voidএকটি ফাংশন আর্গুমেন্ট ইন সি ++ এ alচ্ছিক, int myFunc()ঠিক ঠিক একইরকম int myFunc(void)এবং এটি সি # তে সম্পূর্ণ বাদ পড়েছে। এটি সর্বদা ফেরতের মূল্যের জন্য প্রয়োজন।


7
যুক্তি তালিকায় অকার্যকর সি ঐচ্ছিক ++ দেখতে stackoverflow.com/questions/416345/...
ড্যানিয়েল Earwicker

1
আমি "কোন আকারের" চেয়ে "" কোনও প্রকারের "ব্যবহার করব না
কেজেটিল জোয়ারগেনসেন

@ ইয়ারউইকার এবং কেজেটিজোর, দু'টিই ভাল পয়েন্ট নিয়ে আমি বিতর্ক করেছি, তবে আমার নিদ্রাহীন মনের পক্ষে সাহায্যের প্রয়োজন;) ধন্যবাদ।
জেরাল্ড

9
দ্বিমত পোষণ করছে না, তবে অব্যক্ত মানের জন্য সতর্কতা দমন করতে "কাস্ট টু শূন্য" কৌশলটিতে শূন্যতার অতিরিক্ত ব্যবহার রয়েছে। এটি কিছুটা প্রসারিত যেহেতু এটি সংকলক কীভাবে বিষয়গুলির ব্যাখ্যা করে তার সাথে এটি সত্যিই মিলছে না, তবে আপনি এর অর্থ ব্যাখ্যা করতে পারেন "আমি এই মানটি কিছু না করার জন্য করছি"।
স্টিভ জেসোপ

22
সি ++ এ, যুক্তি তালিকার শূন্যতা optionচ্ছিক। তবে সি-তে এটি alচ্ছিক নয়: foo () এর অর্থ এটি যে কোনও ধরণের প্যারামিটারের অনেকগুলি অংশ নেয়, যখন foo (অকার্যকর) এর অর্থ এটি শূন্য পরামিতি নেয়।
অ্যাডাম রোজেনফিল্ড

33

আমি সবসময় অনুপস্থিত মানেই নিয়েছি । অনুপস্থিত এই ব্যবহারের সাথে সি ভাষার চারটি কেস মেলে

  • R f(void)- ফাংশন পরামিতি অনুপস্থিত
  • void f(P)- ফেরতের মান অনুপস্থিত
  • void *p- কি নির্দেশিত হয় তার ধরণ অনুপস্থিত
  • (void) p- মান ব্যবহার অনুপস্থিত

অন্যান্য সি বংশধররা অন্যান্য জিনিসের জন্য এটি ব্যবহার করে। Dপ্রোগ্রামিং ভাষা ক্ষেত্রে এটি ব্যবহার করে যেখানে একটি সূচনাকারী হয় অনুপস্থিত

  • T t = void;- আরম্ভের মান অনুপস্থিত

4
কি করে (void)p? "মান ব্যবহার অনুপস্থিত" আপনি যা বোঝাতে চেয়েছিলেন তা আমি পুরোপুরি পাইনি।
ইয়াসাস

@Yashas কেউ যদি আরো সম্পর্কে বিভ্রান্ত (void) var;বিবৃতি আমি বিস্তারিত উত্তর পেয়েছি stackoverflow.com/q/21045615
আর্নি

14

শূন্যতা ব্যবহারের দুটি উপায় রয়েছে:

void foo(void);

অথবা

void *bar(void*);

প্রথমটি নির্দেশ করে যে কোনও যুক্তি পাস হচ্ছে না বা কোনও যুক্তি ফেরানো হচ্ছে না।

দ্বিতীয়টি সংকলককে বলে যে কোনও প্রকারের সাথে ডেটার সাথে যুক্ত কোনও প্রভাব নেই কার্যকরভাবে এর অর্থ হ'ল যে আপনি কোনও প্রকারের কাছে ফেলে না দেওয়া পর্যন্ত আপনি যে ডেটা নির্দেশ করেছেন তা ব্যবহার করতে পারবেন না।

উদাহরণস্বরূপ আপনি void*এমন অনেকগুলি ব্যবহার দেখতে পাবেন যখন আপনার ইন্টারফেস থাকে যা এমন ফাংশনকে কল করে যার প্যারামিটারগুলি সময়ের আগে জানা যায় না।

উদাহরণস্বরূপ, লিনাক্স কার্নেলে যখন কাজ পিছিয়ে যায় আপনি পরবর্তী সময়ে সঞ্চালনের জন্য একটি ফাংশন সেটআপ করবেন যা এটি সঞ্চালনের জন্য একটি পয়েন্টার এবং ফাংশনে স্থানান্তরিত করার জন্য ডেটারের একটি পয়েন্টার দিয়ে:

struct _deferred_work {
sruct list_head mylist;
.worker_func = bar;
.data        = somedata;
} deferred_work;

তারপরে একটি কার্নেল থ্রেড স্থগিত কাজের তালিকার উপরে চলে যায় এবং যখন এই নোডটিতে আসে তখন কার্যকরভাবে এটি সম্পাদন করে:

bar(somedata);

তারপরে আপনার বারে রয়েছে:

void bar(void* mydata) {
    int *data = mydata;
    /* do something with data */;
}

13

এর অর্থ "কোনও মূল্য নেই"। আপনি voidবোঝাতে ব্যবহার করেন যে কোনও ফাংশন কোনও মান দেয় না বা এর কোনও পরামিতি বা উভয়ই নেই। ইংরেজিতে শূন্য শব্দের সাধারণ ব্যবহারের সাথে অনেকটা সুসংগত ।


4

এটি কোনও ফাংশনে রিটার্ন মানের অনুপস্থিতি নির্দেশ করে।

কিছু ভাষার দুটি ধরণের সাবরুটাইন থাকে: পদ্ধতি এবং কার্যাদি। পদ্ধতিগুলি কেবলমাত্র ক্রিয়াকলাপের ক্রম, যেখানে একটি ফাংশন অপারেশনের ক্রম যা ফলাফল দেয় return

সি এবং এর ডেরাইভেটিভগুলিতে, দুটির মধ্যে পার্থক্য সুস্পষ্ট নয়। সবকিছুই মূলত একটি ফাংশন। voidশব্দ নির্দেশ করে যে এটি একটি "প্রকৃত" ফাংশন নয়, যেহেতু এটি একটি মান ফেরত দেয় না।


3

"শূন্য কাঠামো" হিসাবে শূন্যতার কথা ভাবেন। আমাকে ব্যাখ্যা করতে দাও.

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

এখন, যখন আমার কোনও "ফাংশন" না "মান" তৈরি করে তখন কী হবে? ভাল, আমি 3 স্লট সহ একটি কাঠামো গঠন করি তখন আমি কী পাই তা বিবেচনা করুন: এটিতে 3 টি মান রয়েছে। যখন আমার 2 টি স্লট রয়েছে, এটি দুটি মান ধারণ করে। যখন এটির একটি স্লট, একটি মান। এবং যখন এর শূন্য স্লট থাকে, তখন এটি ... উহ, শূন্য মান বা "কোন" মান "রাখে না, সুতরাং আমি কোনও ফাংশনকে শূন্যের সাথে ফিরে আসার মতো কোনও মান না রেখে স্ট্রাক্টের কথা ভাবতে পারি। আপনি এমনকি" শূন্য "সিদ্ধান্ত নিতে পারেন খালি কাঠামো দ্বারা উপস্থাপিত টাইপের প্রতিশব্দ, ভাষার কোনও কীওয়ার্ডের পরিবর্তে (সম্ভবত এটি কেবল একটি পূর্বনির্ধারিত প্রকার :)

একইভাবে, আমি কোনও ফাংশনটি ভাবতে পারি যাতে কোনও শূন্য কাঠামো গ্রহণ করার মতো কোনও মান প্রয়োজন হয় না, যেমন, "শূন্য"।

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

অকার্যকর * কিছুটা মজার। আমি মনে করি না যে সি ডিজাইনাররা উপরের উপায়ে শূন্যতার কথা ভাবেন; তারা সবেমাত্র একটি কীওয়ার্ড তৈরি করেছে। সেই কীওয়ার্ডটি তখন পাওয়া যায় যখন কারও কাছে একটি স্বেচ্ছাসেবী টাইপের প্রতি বিন্দুর প্রয়োজন হয়, সুতরাং সি এর মূর্তি হিসাবে অকার্যকর * এটি খালি কাঠামো হিসাবে অকার্যকর ব্যাখ্যা করলে এটি আসলে বেশ ভাল কাজ করে। একটি শূন্য * পয়েন্টার এমন কোনও জায়গার ঠিকানা যেখানে খালি কাঠামোটি রাখা হয়েছে।

অন্য ধরণের টি-এর জন্য অকার্যকর * থেকে টি * পর্যন্ত বর্ণগুলিও এই দৃষ্টিকোণ দিয়ে কাজ করে। পয়েন্টার কাস্টগুলি একটি সম্পূর্ণ প্রতারণা যা বেশিরভাগ সাধারণ আর্কিটেকচারে কাজ করে এই সত্যটি গ্রহণ করার জন্য যে কোনও যৌগ প্রকারের টিতে যদি তার স্টোরেজ বিন্যাসে টি এর শুরুতে শারীরিকভাবে স্থাপন করা হয় তবে তারপরে এস * থেকে টি * এবং cast বিপরীতভাবে একই শারীরিক মেশিন ঠিকানা ব্যবহার করা কার্যকর হয়, যেহেতু বেশিরভাগ মেশিন পয়েন্টারগুলির মধ্যে একটির প্রতিনিধিত্ব থাকে। টাইপ এস এর পরিবর্তে অকার্যকর টাইপ করে ঠিক একই প্রভাব দেয় এবং এইভাবে / থেকে শূন্য * থেকে ingালাই কার্যকর হয়।

পার্লানস প্রোগ্রামিং ল্যাঙ্গুয়েজ উপরের ধারণাগুলি বেশ কাছাকাছিভাবে প্রয়োগ করে। আমরা এর নকশায় বোকা বানিয়েছি, এবং রিটার্নের ধরণ হিসাবে "অকার্যকর" দিকে খুব বেশি মনোযোগ দিইনি এবং এইভাবে পদ্ধতির জন্য ল্যাডেজ কীওয়ার্ড রয়েছে। এটি বেশিরভাগ মাত্র একটি সাধারণ বাক্য গঠন পরিবর্তন তবে আপনি কোনও ভাষায় একটি বৃহত বডি ওয়ার্কিং কোড পাওয়ার পরে এটির মধ্যে একটি জিনিস আপনি ঘেঁষতে পারবেন না।


2

সি # তে আপনি শূন্য কীওয়ার্ডটি ব্যবহার করে ইঙ্গিত করতে পারেন যে কোনও পদ্ধতি কোনও মান ফেরায় না:

public void DoSomeWork()
{
//some work
}

4
অধিকাংশ মানুষ System.Void structure- যে অকার্যকর মানচিত্রগুলি বুঝতে পারছি না msdn.microsoft.com/en-us/library/system.void.aspx
RichardOD

2

অকার্যকর জন্য তিনটি ব্যবহারের ক্ষেত্রে:

  1. ফাংশন স্বাক্ষর। void foo(int bar)একটি মান দেয় না। int bar(void)কোন প্যারামিটার নেয় না কিন্তু এই সাধারণত খালি যুক্তি তালিকা সঙ্গে প্রকাশ করা হয়: int bar()। এখানে অকার্যকর কীওয়ার্ডের ব্যবহার ইংরেজি এর অর্থের সাথে মিলে যায়।

  2. জেনেরিক শীর্ষ-ধরণের পয়েন্টার void *যা অনির্ধারিত ডেটাতে নির্দেশ করে এবং তা অবহেলা করা যায় না। এখানে শূন্যতার অর্থ শূন্যের অন্যান্য অর্থ থেকে পৃথক: সর্বজনীন টাইপ বনাম কোনও প্রকার নয়।

  3. বর্ণগুলিতে যেমন (void) new Foo(this)বোঝাতে হয় যে ফেরতের মান ইচ্ছাকৃতভাবে ফেলে দেওয়া হয়েছে। এখানে কীওয়ার্ডের ব্যবহারটি ইংরেজিতে এর অর্থের সাথেও মেলে।

কেস 1 এবং 2 ইতিমধ্যে @ জেরাল্ড দ্বারা কভার করা হয়েছিল তবে 3 টি মামলা এখনও মোকাবেলা করা হয়নি।


2

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

এটি সর্বদা কোডে উপস্থিত হয় যেখানে সাধারণত আপনি কোনও প্রকার উপস্থিত যেমন প্রত্যাবর্তন টাইপ বা পয়েন্টার প্রকারের আশা করবেন। এই কারণেই সি # তে, একটি আসল সিএলআর টাইপ, সিস্টেম.ভয়েডের কাছে অকার্যকর মানচিত্র because

কিছু প্রোগ্রামিং ল্যাঙ্গুয়েজ কখনই অকার্যকর ধারণাটি বিকাশ করে না, ঠিক তেমন কিছু মানব সংস্কৃতি কখনও শূন্যের ধারণাটি আবিষ্কার করেনি। শূন্য ধারণাটি মানুষের ভাষার প্রতিনিধিত্ব করে বলে শূন্যতা প্রোগ্রামিং ভাষায় একই অগ্রগতির প্রতিনিধিত্ব করে।


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

আমার সর্বশেষ মন্তব্যে সংশোধন - আমি বলতে চাই শেষ অনুচ্ছেদটি (বাক্য নয়) not
এম্পলিং করুন Mark

1

এর অর্থ "কোনও মূল্য নেই"। আপনি কোনও ফাংশনটি কোনও মান দেয় না বা এর কোনও প্যারামিটার বা উভয়ই নেই তা বোঝাতে আপনি অকার্যকর ব্যবহার করেন t এটি ইংরেজিতে শূন্য শব্দের সাধারণ ব্যবহারের সাথে অনেকটা সুসংগত।

অকার্যকর নাল দিয়ে বিভ্রান্ত করা উচিত নয়। নাল অর্থ হল সেই চলকটির জন্য যার ঠিকানা স্ট্যাকে রয়েছে, সেই ঠিকানার জন্য স্তূপের মান খালি is


0

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

যেমন

void MethodThatReturnsAndTakesVoid(void)
{
// Method body
}

সি # তে আমরা পরামিতিগুলির শূন্যতা বাদ দিতে পারি এবং উপরের কোডটি লিখতে পারি:

void MethodThatReturnsAndTakesVoid()
{
// Method body
}

অকার্যকর নাল দিয়ে বিভ্রান্ত করা উচিত নয়। নাল অর্থ হল সেই চলকটির জন্য যার ঠিকানা স্ট্যাকে রয়েছে, সেই ঠিকানার জন্য স্তূপের মান খালি is


0

শূন্যতা একটি অসম্পূর্ণ প্রকার, যা সংজ্ঞা অনুসারে, একটি মূল্য হতে পারে না। এর অর্থ এটি কোনও মান নির্ধারণ করতে পারে না।

সুতরাং এটি কোন মান ধরে রাখতে পারে না।



-1

অকার্যকর অর্থ তিনটি ভাষার সমস্ত ফাংশন থেকে রিটার্ন টাইপের কোনও মানের প্রয়োজন নেই।


-1

অকার্যকর ভিজ্যুয়াল বেসিক সাব এর সমতুল্য।


কেবল রিটার্নের ধরণ হিসাবে। আমি শূন্যতার আরও তিনটি ব্যবহার সম্পর্কে ভাবতে পারি: শূন্য আর্গুমেন্ট (ফাংশন কিছুই নেয় না), শূন্য পয়েন্টার (কোনও পয়েন্টার টাইপ নির্দিষ্ট করা হয়নি), এবং শূন্য ক্যাসেট (মান বাতিল করা)।
c4757p
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.