সি / সি ++ এ [নষ্ট]


153

সাম্প্রতিক কোড পর্যালোচনায়, একটি অবদানকারী কার্যকর করার চেষ্টা করছে যে NULLপয়েন্টারে সমস্ত চেক নিম্নলিখিত পদ্ধতিতে করা উচিত:

int * some_ptr;
// ...
if (some_ptr == NULL)
{
    // Handle null-pointer error
}
else
{
    // Proceed
}

পরিবর্তে

int * some_ptr;
// ...
if (some_ptr)
{
    // Proceed
}
else
{
    // Handle null-pointer error
}

আমি সম্মত হই যে তার উপায়টি এই অর্থে আরও স্পষ্ট যে এটি স্পষ্টভাবে বলছে "নিশ্চিত করুন যে এই পয়েন্টারটি নুল নয়", তবে আমি এই কথাটি বলে যে এই কোডটিতে কাজ করা যে কেউ বুঝতে পারবে যে একটিতে পয়েন্টার ভেরিয়েবল ব্যবহার করে ifবিবৃতি স্পষ্টভাবে জন্য পরীক্ষা করা হয় NULL। এছাড়াও আমি অনুভব করি যে দ্বিতীয় পদ্ধতিতে ইগের একটি বাগ প্রবর্তনের আরও কম সুযোগ রয়েছে:

if (some_ptr = NULL)

যা অনুসন্ধান এবং ডিবাগ করার জন্য কেবল একটি পরম ব্যথা।

আপনি কোন উপায়ে পছন্দ করেন এবং কেন?


32
আপনি কোন স্টাইলটি বেছে নেন তার চেয়ে সামঞ্জস্যপূর্ণ শৈলী থাকা কখনও কখনও গুরুত্বপূর্ণ।
মার্ক মুক্তিদান

15
@ মার্ক: ধারাবাহিকতা সর্বদা আপনার শৈলীর সবচেয়ে গুরুত্বপূর্ণ উপাদান।
এসবিআই

13
"এছাড়াও আমি অনুভব করি যে দ্বিতীয় পদ্ধতিতে ইলকের একটি বাগ প্রবর্তনের আরও কম সুযোগ রয়েছে: যদি (কিছু_ptr = NULL)" এই কারণেই কিছু লোক যদি (NULL == some_ptr) ব্যবহার করে তবে NUL এ নিয়োগ করতে পারবেন না যাতে আপনি পাবেন একটি সংকলন ত্রুটি
ব্যবহারকারী 122302

14
আজকাল বেশিরভাগ সংকলকগণ শর্তসাপেক্ষে অ্যাসাইনমেন্ট সম্পর্কে সতর্ক করে দেয় - দুর্ভাগ্যক্রমে অনেকগুলি ডিভেল কম্পাইলারের সতর্কতা উপেক্ষা করে।
মাইক এলারি

10
আমি উপরের বিবৃতিটির সাথে একমত নই যে ধারাবাহিকতাটি গুরুত্বপূর্ণ। ধারাবাহিকতার সাথে এর কোনও যোগসূত্র নেই; যাইহোক ভাল বাছাই না। এটি সেই অঞ্চল যেখানে আমাদের প্রোগ্রামারদের তাদের নিজস্ব স্টাইলটি প্রকাশ করতে দেওয়া উচিত। যদি এমন কোনও ব্যক্তি থাকে যা তাৎক্ষণিকভাবে উভয় ফর্মটি বুঝতে না পারে তবে তাদের এখনই কোড পড়া বন্ধ করা উচিত এবং ক্যারিয়ারের পরিবর্তনটি বিবেচনা করা উচিত। আমি এর চেয়ে আরও বলব: যদি কোনও প্রসাধনী ধারাবাহিকতা থাকে তবে আপনি কোনও স্ক্রিপ্টের সাথে স্বয়ংক্রিয়ভাবে প্রয়োগ করতে পারবেন না তবে এটি সরিয়ে ফেলুন। মানুষের নৈতিকতা ফুটিয়ে তোলার ব্যয়টি একটি সভায় লোকেরা যে বোকা সিদ্ধান্ত নেয় তার চেয়ে বেশি গুরুত্বপূর্ণ।
উইলহেমটেল

উত্তর:


203

আমার অভিজ্ঞতায়, ফর্মের পরীক্ষা if (ptr)বা if (!ptr)পছন্দসই। তারা প্রতীক সংজ্ঞা উপর নির্ভর করে না NULL। দুর্ঘটনাজনিত কার্যভারের সুযোগ তারা প্রকাশ করে না। এবং তারা পরিষ্কার এবং সংক্ষিপ্ত।

সম্পাদনা: সোপবক্স যেমন একটি মন্তব্যে উল্লেখ করেছে, তারা সি ++ শ্রেণীর সাথে সামঞ্জস্যপূর্ণ যেমন auto_ptrবস্তু যা পয়েন্টার হিসাবে কাজ করে এবং boolএই আইডিয়মটি ঠিক সক্ষম করার জন্য রূপান্তর সরবরাহ করে । এই বিষয়গুলির জন্য, একটি সুস্পষ্ট তুলনা NULLপয়েন্টারে রূপান্তর করতে হবে যা অন্যান্য শব্দার্থবিজ্ঞান পার্শ্ব প্রতিক্রিয়া থাকতে পারে বা boolরূপান্তরটি বোঝায় যে সাধারণ অস্তিত্ব চেক চেয়ে বেশি ব্যয়বহুল হতে পারে ।

আমার কোডের পক্ষে একটি অগ্রাধিকার রয়েছে যা বলছে যে বিনা পাঠ্য পাঠ ছাড়াই এর অর্থ। অপ্রয়োজনীয় সুনির্দিষ্টতার ব্যয়ের সাথে if (ptr != NULL)একই অর্থ রয়েছে if (ptr)। পরবর্তী যৌক্তিক জিনিসটি হ'ল লিখন if ((ptr != NULL) == TRUE)এবং সেভাবেই উন্মাদনা। সি ভাষাটি পরিষ্কার যে একটি বুলিয়ান পরীক্ষা করেছে if, whileবা এর মতো শূন্য-অমূল্যের একটি নির্দিষ্ট অর্থ সত্য এবং শূন্যটি মিথ্যা। অতিরিক্ত কাজ এটি পরিষ্কার করে না cle


23
অতিরিক্তভাবে, এগুলি পয়েন্টার মোড়ক ক্লাসগুলির সাথে সামঞ্জস্যপূর্ণ (শেয়ার্ড_পিটার, অটো_পিটার, স্কোপড_আর, ইত্যাদি) যা সাধারণত অপারেটর বুলকে (বা সেফ_বুল) ওভাররাইড করে।
সোপবক্স

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

2
@ ব্রায়ান, আমি এটি শ্রদ্ধা করি এবং যদি "আরও ভাল" উত্তর আসে তবে দয়া করে প্রয়োজন হিসাবে চেক চিহ্নটি সরাতে নির্দ্বিধায় অনুভব করুন। সাবজেক্টিভিটির ক্ষেত্রে, হ্যাঁ এটি সাবজেক্টিভ। তবে এটি অন্তত একটি বিষয়গত আলোচনা যেখানে প্রশ্ন উত্থাপনের সময় উদ্দেশ্যমূলক বিষয়গুলি সর্বদা সুস্পষ্ট হয় না। লাইনটি অস্পষ্ট। এবং সাবজেক্টিভ ... ;-)
RBerteig

1
একটি গুরুত্বপূর্ণ বিষয় লক্ষণীয়: সম্প্রতি অবধি, আমি "if (ptr)" এর পরিবর্তে "if (ptr! = NULL)" বা "if (ptr! = Nullptr)" লেখার পক্ষে ছিলাম কেননা এটি আরও সংক্ষিপ্ত কোডটি আরও পঠনযোগ্য। তবে আমি সবেমাত্র জানতে পেরেছি যে সাম্প্রতিক সংকলকগুলিতে NULL / নাল্প্ট্রারের সাথে তুলনা করার জন্য তুলনাটি সতর্কতা / ত্রুটি উত্থাপন করে। সুতরাং আপনি যদি কোনও পয়েন্টার পরীক্ষা করতে চান তবে "if (ptr)" এর পরিবর্তে "if (ptr! = NULL)" করা ভাল। আপনি যদি ভুলভাবে পিটিআরটি একটি ইন্ট হিসাবে ঘোষণা করেন তবে প্রথম চেকটি একটি সতর্কতা / ত্রুটি উত্থাপন করবে, অন্যদিকে কোনও সতর্কতা ছাড়াই সংকলন করবে।
আর্নাউড

1
@ ডেভিড 天宇 ওং নং, এটিই বোঝানো হয়নি। এই পৃষ্ঠার উদাহরণটি দুটি লাইন ক্রম int y = *x; if (!x) {...}যেখানে অপ্টিমাইজারটি যুক্তিযুক্ত হওয়ার অনুমতি দেয় যেহেতু নুল *xযদি অপরিজ্ঞাত হয় তবে xএটি অবশ্যই নাল নয় এবং তাই !xঅবশ্যই মিথ্যা হবে। অভিব্যক্তি!ptr হয় না আচরণ undefined। উদাহরণস্বরূপ, যদি কোনও ব্যবহারের আগে পরীক্ষা করা হয়, তবে পরীক্ষাটি *xঅপসারণের জন্য অপটিমাইজারটি ভুল হবে।
আরবের্তেগ

52

if (foo)যথেষ্ট পরিষ্কার। এটা ব্যবহার করো.


25

আমি এটি দিয়ে শুরু করব: ধারাবাহিকতা রাজা, আপনার কোড বেসের ধারাবাহিকতার চেয়ে সিদ্ধান্ত কম গুরুত্বপূর্ণ।

সি ++ এ

সিএল ++ এ NULL 0 বা 0L হিসাবে সংজ্ঞায়িত করা হয়েছে।

আপনি যদি সি ++ প্রোগ্রামিং ল্যাঙ্গুয়েজটি পড়ে থাকেন বাজরেন স্ট্রাস্ট্রপ অ্যাসাইনমেন্ট করার সময় ম্যাক্রো 0এড়ানোর জন্য স্পষ্টভাবে ব্যবহার করার পরামর্শ দেয় তবেNULL আমি নিশ্চিত নই যে তিনি তুলনা করে একই করেছেন কিনা, আমি বইটি পড়ে কিছুক্ষণ হয়ে গেলাম, আমার মনে হয় তিনি কেবল করেছেনif(some_ptr) সুস্পষ্ট তুলনা ছাড়াই তবে আমি তাতে অস্পষ্ট।

এর কারণ হ'ল NULLম্যাক্রো বিভ্রান্তিমূলক (প্রায় সব ম্যাক্রো হ'ল) ​​এটি আসলে 0আক্ষরিক, নাম অনুসারে এটি কোনও অনন্য প্রকার নয় sugges সি ++ এর অন্যতম সাধারণ নির্দেশিকা ম্যাক্রোগগুলি এড়ানো। অন্য দিকে,0 দেখতে পূর্ণসংখ্যার মতো লাগে এবং এটি যখন পয়েন্টারগুলির সাথে তুলনা করা বা নির্ধারিত হয় তা হয় না। ব্যক্তিগতভাবে আমি যে কোনও উপায়ে যেতে পারতাম, তবে সাধারণত আমি স্পষ্ট তুলনা এড়িয়ে যাই (যদিও কিছু লোক এটি পছন্দ করে না কারণ সম্ভবত আপনার কোনও সহযোগী যেভাবেই কোনও পরিবর্তনের পরামর্শ দেয়)।

ব্যক্তিগত অনুভূতি নির্বিশেষে এটি একটি সঠিক পদ্ধতি না হওয়ায় এটি মূলত সর্বনিম্ন দুষ্টের পছন্দ।

এটি পরিষ্কার এবং একটি সাধারণ প্রতিমা এবং আমি এটি পছন্দ করি, তুলনার সময় দুর্ঘটনাক্রমে কোনও মূল্য নির্ধারণের কোনও সম্ভাবনা নেই এবং এটি স্পষ্টভাবে পড়ে:

if(some_ptr){;}

এটি যদি আপনি জানেন যে some_ptrএটি একটি পয়েন্টার ধরণের, তবে এটি একটি পূর্ণসংখ্যার তুলনার মতো দেখতেও স্পষ্ট :

if(some_ptr != 0){;}

এটি স্পষ্ট-ইশ, সাধারণ ক্ষেত্রে এটি বোধগম্য হয় ... তবে এটি একটি ফাঁসযুক্ত বিমূর্ততা, NULLআসলে 0আক্ষরিক এবং সহজেই অপব্যবহারের অবসান হতে পারে:

if(some_ptr != NULL){;}

সি ++ 0 এক্স এর নলপ্টর রয়েছে যা স্পষ্ট এবং নির্ভুল হওয়ায় এখন পছন্দসই পদ্ধতি, দুর্ঘটনাজনিত কার্যভার সম্পর্কে সতর্ক থাকুন:

if(some_ptr != nullptr){;}

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

সি তে

সি একটি আলাদা জন্তু।

সি NULL তে 0 বা ((অকার্যকর *) 0) হিসাবে সংজ্ঞায়িত করা যেতে পারে, C99 নির্ধারিত নাল পয়েন্টার ধ্রুবক বাস্তবায়নের অনুমতি দেয়। সুতরাং এটি বাস্তবায়নের NUL বাস্তবায়নের সংজ্ঞায় নেমে আসে এবং আপনাকে এটি আপনার স্ট্যান্ডার্ড লাইব্রেরিতে পরিদর্শন করতে হবে।

ম্যাক্রোগুলি খুব সাধারণ এবং সাধারণভাবে তারা ভাষা এবং অন্যান্য বিষয়গুলিতে জেনেরিক প্রোগ্রামিং সমর্থনগুলিতে ঘাটতি পূরণ করতে প্রচুর ব্যবহৃত হয়। ভাষাটি অনেক সাধারণ এবং প্রাক-প্রসেসরের উপর বেশি নির্ভরতা সাধারণ iance

এই দৃষ্টিকোণ থেকে আমি সম্ভবত NULLসি তে ম্যাক্রো সংজ্ঞা ব্যবহার করার পরামর্শ দেব


TL; ড এবং যদিও আপনি চলেছেন অধিকার 0সি ++ এটা সি অর্থ করেছেন: (void *)0। সি ++ 0তে পছন্দনীয় NULL, কারণ টাইপ ত্রুটিগুলি পিআইটিএ হতে পারে।
ম্যাট যোগদানকারী

@ ম্যাট: তবে NULLযাই হোক শূন্য।
GManNickG

@ জিএমান: আমার সিস্টেমে নেই: #define NULL ((void *)0)থেকেlinux/stddef.h
ম্যাট

@ ম্যাট: সি ++ এ। আপনি বলেছেন যে 0 টি ভাল, তবে NULLঅবশ্যই শূন্য হতে হবে।
GManNickG

এটি একটি ভাল বিষয়, আমি এটি উল্লেখ করতে অবহেলা করেছি এবং এটির পরামর্শ দিয়ে আমি আমার উত্তরটি উন্নত করছি। এএনএসআই সি নুলকে ((অকার্যকর *) 0) হিসাবে সংজ্ঞায়িত করতে পারে, সি ++ নুলকে 0 হিসাবে সংজ্ঞায়িত করে আমি এর জন্য সরাসরি স্ট্যান্ডার্ডটি ট্রল করি নি তবে আমার বোধগম্য যে সি ++ তে নুল 0 বা 0 এল হতে পারে।
এম 2 টি এম

19

আমি ব্যবহার করি if (ptr), তবে এটি সম্পর্কে বিতর্ক করা মোটেই উপযুক্ত নয়।

আমি আমার পথটি পছন্দ করি কারণ এটি সংক্ষিপ্ত, যদিও অন্যরা বলেন == NULLএটি পড়া সহজ এবং আরও স্পষ্ট করে তোলে। আমি দেখতে পাচ্ছি তারা কোথা থেকে আসছে, আমি কেবলমাত্র অতিরিক্ত জিনিসগুলি এটিকে আরও সহজ করে দেয় তা নিয়ে দ্বিমত পোষণ করছি। (আমি ম্যাক্রোকে ঘৃণা করি, তাই আমি পক্ষপাতিত্ব করি)) আপনার উপর।

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

সি ++ 0x মধ্যে মনে রাখবেন, আমরা কি করতে পারি if (ptr == nullptr)যা আমার কাছে আছে পঠিত সুন্দর। (আবারও, আমি ম্যাক্রোকে ঘৃণা করি But nullptrতবে দুর্দান্ত)) আমি এখনও তা করি if (ptr), কারণ এটি আমার অভ্যস্ত।


আশা করি অতিরিক্ত 5 বছরের অভিজ্ঞতার ফলে আপনার মন পরিবর্তন হয়েছে :) যদি সি ++ / সি অপারেটর যদি আইফ_এক্সিস্ট () এর মতো কিছু থাকে তবে তা বোঝা যাবে।
মাগুল্লা

10

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

যদি আপনি ত্রুটিটি চিহ্নিত করে ফাংশনটি চালিয়ে না যাওয়ার পরিকল্পনা করেন (যেমন, আপনি একটি ব্যতিক্রম ছুঁড়ে ফেলতে বা তত্ক্ষণাত একটি ত্রুটি কোড ফেরত পাঠাচ্ছেন), আপনার এটিকে একটি গার্ড ক্লজ করা উচিত:

int f(void* p)
{
    if (!p) { return -1; }

    // p is not null
    return 0;
}

এইভাবে, আপনি "তীর কোড" এড়ান।


কেউ এখানে কুকুরুকু.কম / হব / প্রোগ্রামগ্রামিং / আই- ডিও- নোট- জ্ঞান- সি নির্দেশ করেছেন এটি অপরিজ্ঞাতif(!p) আচরণ। এটা কাজ করতে পারে বা না পারে।
ডেভিড 天宇 ওয়াং

@ ডেভিড 天宇 ওয়াং আপনি যদি এই লিঙ্কটিতে উদাহরণ # 2 সম্পর্কে কথা বলছেন তবে এটি পূর্বনির্ধারিত if(!p)আচরণ নয়, এটির পূর্বের রেখাটি। এবং if(p==NULL)ঠিক একই সমস্যা হবে।
মার্ক রান্সম

8

ব্যক্তিগতভাবে আমি সর্বদা ব্যবহার করেছি if (ptr == NULL)কারণ এটি আমার উদ্দেশ্যটিকে স্পষ্ট করে তোলে তবে এই মুহূর্তে এটি কেবল একটি অভ্যাস।

=এর জায়গায় ব্যবহার করা ==সঠিক সতর্কতা সেটিংস সহ যে কোনও উপযুক্ত সংকলক দ্বারা ধরা পড়বে।

গুরুত্বপূর্ণ বিষয়টি হ'ল আপনার গোষ্ঠীর জন্য একটি সামঞ্জস্যপূর্ণ শৈলী বাছাই করা এবং এটির সাথে আঁকুন। আপনি যে পথেই যান না কেন, আপনি অবশেষে এটিতে অভ্যস্ত হয়ে যাবেন এবং অন্য ব্যক্তির কোডে কাজ করার সময় ঘর্ষণ ক্ষতির বিষয়টি স্বাগত হবে।


7

foo == NULLঅনুশীলনের পক্ষে আরও একটি বিষয় : যদি fooহয়, বলুন, একটি int *বা একটি bool *, তবে if (foo)চেকটি দুর্ঘটনাক্রমে পাঠকের দ্বারা পয়েন্টটির মান পরীক্ষা করার অর্থ ব্যাখ্যা করা যেতে পারে, যেমন if (*foo)। এখানে NULLতুলনাটি একটি অনুস্মারক যা আমরা একটি পয়েন্টারের কথা বলছি is

তবে আমি মনে করি একটি ভাল নামকরণের কনভেনশনটি এই যুক্তিটিকে তত্পর করে তোলে।


4

আসলে, আমি উভয় রূপ ব্যবহার করি।

এমন পরিস্থিতি রয়েছে, যেখানে আপনি প্রথমে কোনও পয়েন্টারের বৈধতা পরীক্ষা করে দেখুন এবং যদি এটি নুল হয়, আপনি কেবল কোনও ফাংশন থেকে বেরিয়ে / প্রস্থান করবেন। (আমি জানি এটি "আলোচনার দিকে পরিচালিত করতে পারে" কোনও ক্রিয়াকলাপের কেবলমাত্র একটি বহির্গমন পয়েন্ট থাকতে হবে ")

বেশিরভাগ সময়, আপনি পয়েন্টারটি পরীক্ষা করেন, তারপরে আপনি যা চান তা করুন এবং তারপরে ত্রুটি কেস সমাধান করুন। ফলাফলটি যদি একাধিকের সাথে কুৎসিত এক্স-বার ইন্ডেন্টড কোড হতে পারে।


1
আমি ব্যক্তিগতভাবে তীর কোডটিকে ঘৃণা করি যা একটি প্রস্থান পয়েন্ট ব্যবহার করে ফলাফল দেয় using আমি যদি ইতিমধ্যে উত্তরটি জানি তবে প্রস্থান করবেন না কেন?
ruslik

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

এই জাতীয় ক্ষেত্রে @ জালফ gotoখুব সহজেই কাজ করতে পারে। এছাড়াও অনেক ক্ষেত্রে malloc()পরিষ্কার-পরিচ্ছন্নতার প্রয়োজন এমন একটি দ্রুত পরিবর্তিত হতে পারে alloca()। আমি জানি তাদের সুপারিশ করা হয় না, তবে এগুলি একটি কারণে উপস্থিত রয়েছে (আমার দ্বারা, একটি ভাল নামযুক্ত লেবেল gotoএকটি আবছা if/elseগাছের চেয়ে অনেক বেশি পরিষ্কার )।
ruslik

1
allocaএটি মানহীন এবং সম্পূর্ণ নিরাপদ নয় is যদি এটি ব্যর্থ হয় তবে আপনার প্রোগ্রামটি কেবল ফুরিয়ে যাবে। পুনরুদ্ধারের কোনও সুযোগ নেই এবং স্ট্যাকটি তুলনামূলকভাবে ছোট হওয়ায় ব্যর্থতা সম্ভবত রয়েছে likely ব্যর্থতায়, এটি সম্ভব যে আপনি গাদা আঁটি কাটা এবং বিশেষাধিকার-সমঝোতা দুর্বলতার পরিচয় দিন। বরাদ্দ করা হবে এমন আকারের উপর allocaআপনার যদি একটি ছোট বাঁধা না থাকে তবে কখনও কখনও ব্যবহার বা ভ্লাস করবেন না (এবং তারপরে আপনি কেবল একটি সাধারণ অ্যারে ব্যবহার করতে পারেন)।
আর .. গিটহাব বন্ধ করুন ICE

4

সি প্রোগ্রামিং ল্যাঙ্গুয়েজ (কেএন্ডআর) আপনার কোনও দুর্ঘটনাজনিত কার্যভার এড়াতে নাল == পিটিআর পরীক্ষা করতে চাইবে।


23
কেএন্ডআর জিজ্ঞাসা করবে "স্মার্ট পয়েন্টার কী?" সি ++ বিশ্বে জিনিস পরিবর্তন হচ্ছে।
অ্যালেক্স এমেলিয়ানভ

2
বা বরং, জিনিসগুলি ইতিমধ্যে সি ++ বিশ্বে পরিবর্তিত হয়েছে ";)
জাল্ফ

3
কে অ্যান্ড আর কোথায় রেফারেন্স দেয়? তারা নিজেরাই এই স্টাইলটি কখনই ব্যবহার করে না। কে & R2 হলো অধ্যায় 2 এমনকি তারা সুপারিশ if (!valid)উপরে if (valid == 0)।
স্কট

6
লোকেরা বসুন। তিনি বলেছেন কে ও আর, কে অ্যান্ড আর নয়। এগুলি স্পষ্টতই কম বিখ্যাত কারণ তাদের আদ্যক্ষর এমনকি মূলধন হয় না।
jmucchiello

1
মূলধন আপনাকে কেবল ধীর করে দেয়
ডেরেক

3

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

এবং এটি যে গুরুত্বপূর্ণ তা নয়, তবে আমার ব্যক্তিগত পছন্দ if (ptr)। অর্থটি আমার কাছে তাত্ক্ষণিকভাবে তার চেয়েও তাত্ক্ষণিক obviousif (ptr == NULL)

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

এর ব্যতিক্রম হ'ল ত্রুটিটি যদি আমাকে ফাংশন থেকে জামিন দেয় বা আমি এগিয়ে যাওয়ার আগে এটি থেকে সেরে উঠতে পারি। এই ক্ষেত্রে, আমি প্রথমে ত্রুটিটি পরিচালনা করি:

if (error_condition)
  bail_or_fix();
  return if not fixed;

// If I'm still here, I'm on the happy path

সামনের দিকে অস্বাভাবিক পরিস্থিতি মোকাবেলা করে, আমি এটির যত্ন নিতে পারি এবং তারপরে এটি ভুলে যেতে পারি। তবে যদি আমি সামনের দিকে হাত দিয়ে সুখী পথে ফিরে না যেতে পারি তবে এটি পরে পরিচালনা করা উচিত মূল কেসের কারণ এটি আরও বোধগম্য করে তোলে। আমার মতে.

তবে যদি এটি কোনও স্টাইল গাইডে না থাকে তবে এটি কেবল আমার মতামত, এবং আপনার মতামত ঠিক ততটাই বৈধ। হয় মানিক করা বা না। কোনও মতামত পেয়েছেন বলেই কোনও পর্যালোচক ছদ্ম-মানিক হতে দেবেন না।


1

এটি উভয় ভাষার অন্যতম মৌলিক বিষয় যা পয়েন্টাররা এমন একটি প্রকার এবং মানকে মূল্যায়ন করে যা নিয়ন্ত্রণ অভিব্যক্তি হিসাবে boolC ++ এবং সি তে ব্যবহৃত হতে পারে intকেবল এটি ব্যবহার করুন।


1
  • পয়েন্টারগুলি বুলিয়ান নয়
  • আধুনিক সি / সি ++ সংকলকগণ যখন একটি if (foo = bar)দুর্ঘটনাক্রমে লেখেন তখন একটি সতর্কতা নির্গত হয়।

অতএব আমি পছন্দ করি

if (foo == NULL)
{
    // null case
}
else
{
    // non null case
}

অথবা

if (foo != NULL)
{
    // non null case
}
else
{
    // null case
}

তবে, আমি যদি স্টাইল নির্দেশিকাগুলির সেট লিখছি তবে আমি এর মধ্যে জিনিসগুলি রাখছি না, আমি এই জাতীয় জিনিসগুলি রাখছি

নিশ্চিত করুন যে আপনি পয়েন্টারে একটি নাল চেক করেছেন।


2
এটি সত্য যে পয়েন্টারগুলি বুলিয়ান নয়, তবে সি-তে, যদি বিবৃতিগুলি বুলিয়ান নেয় না: তারা পূর্ণসংখ্যার ভাব প্রকাশ করে।
কেন

@ কেন: সে কারণেই সি সেভাবে ভেঙেছে। ধারণাগতভাবে, এটি একটি বুলিয়ান এক্সপ্রেশন এবং (আমার মতে) এটির মতো আচরণ করা উচিত।
জেরেমিপ

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

@ কেন: একটি বুলিয়ান একটি সংখ্যা বা একটি পয়েন্টার নয় ধারণাটি , কখনই কোন ভাষা বিবেচনা করবেন না।
জেরেমিপ

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

1

আমি যে সি / সি ++ ধরনের পরীক্ষা নেই বুলিয়ান অবস্থায় একটি বিশাল ফ্যান if, forএবং whileবিবৃতি। আমি সর্বদা নিম্নলিখিতটি ব্যবহার করি:

if (ptr)

if (!ptr)

এমনকি পূর্ণসংখ্যা বা অন্যান্য ধরণের ক্ষেত্রেও যেগুলিকে বুলিতে রূপান্তরিত করে:

while(i--)
{
    // Something to do i times
}

while(cin >> a >> b)
{
    // Do something while you've input
}

এই স্টাইলে কোডিং আমার কাছে আরও পঠনযোগ্য এবং পরিষ্কার। শুধু আমার ব্যক্তিগত মতামত।

সম্প্রতি, ওকেআই 431 মাইক্রোকন্ট্রোলারের সাথে কাজ করার সময়, আমি লক্ষ্য করেছি যে নিম্নলিখিত:

unsigned char chx;

if (chx) // ...

তুলনায় আরও দক্ষ

if (chx == 1) // ...

কারণ পরবর্তী ক্ষেত্রে সংকলকটির chx এর মান 1 এর সাথে তুলনা করতে হবে যেখানে chx কেবল একটি সত্য / মিথ্যা পতাকা।


1

আমি ব্যবহার করেছি বেশিরভাগ সংকলক কমপক্ষে ifআরও বিন্যাস বাক্স ছাড়াই অ্যাসাইনমেন্ট সম্পর্কে সতর্ক করবে , সুতরাং আমি এই যুক্তিটি কিনছি না। এটি বলেছিল, আমি উভয়কে পেশাদারভাবে ব্যবহার করেছি এবং উভয়ের পক্ষে কোনও পছন্দ নেই। == NULLস্পষ্টভাবে আমার মতে যদিও পরিষ্কার হয়।

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