সি-তে ডিফল্ট এনাম মানগুলি কি সমস্ত সংকলকগুলির জন্য একই?


107

যখন একটি enum প্রকাশক নিচের চিত্রের, সমস্ত সি কম্পাইলার হিসাবে ডিফল্ট মান সেট করবেন x=0, y=1এবং z=2উভয় লিনাক্স এবং উইন্ডোজ সিস্টেমে?

typedef enum {
    x,
    y,
    z
} someName;

3
হ্যাঁ, এটি মানদণ্ডগুলির দ্বারা প্রয়োজনীয়, এবং আমি নিশ্চিত যে কেউ এগুলি উদ্ধৃত করতে সক্ষম হবে।
নিমো

উত্তর:


115

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


14
এবং, এই অভিন্ন আচরণের জন্য সি এবং সি ++ উভয়ই প্রয়োজনীয়। সি ++ এ, এটি [dcl.enum]হ'ল: "যদি প্রথম গণকের কোনও আরম্ভকারী না থাকে তবে সংশ্লিষ্ট ধ্রুবকের মান শূন্য হয় an
বেন ভয়েগট

3
হ্যাঁ, এবং অন্যান্য ভাষাও সি বর্ণের সাথে সি # এর মতো শুরু হয়।
জেমস ম্যাকনেলিস

70

সি 99 স্ট্যান্ডার্ড

N1265 C99 খসড়া 6.7.2.2/3 "এনুমারেশন নির্দিষ্টকরী" এ বলে

= সহ একটি গণক তার গণনার ধ্রুবককে ধ্রুবক প্রকাশের মান হিসাবে সংজ্ঞায়িত করে। প্রথম গণকের যদি না =থাকে তবে এর গণনা ধ্রুবকের মান 0 হয়। পরবর্তী = পরবর্তী প্রতিটি অঙ্কটি তার গণনাটির ধ্রুবককে পূর্ববর্তী অঙ্কের ধ্রুবকের মান 1 যোগ করে প্রাপ্ত ধ্রুবক অভিব্যক্তির মান হিসাবে সংজ্ঞায়িত করে। (= এর সাথে গণনার ব্যবহারের সাথে একই মান হিসাবে অন্যান্য মানগুলি নকল করে এমন মানগুলি সহ গণনা স্থির উত্পাদন করা যেতে পারে))

সুতরাং নিম্নলিখিতটি সর্বদা বাস্তবায়নগুলি মেনে চলে:

main.c

#include <assert.h>
#include <limits.h>

enum E {
    E0,
    E1,
    E2 = 3,
    E3 = 3,
    E4,
    E5 = INT_MAX,
#if 0
    /* error: overflow in enumeration values */
    E6,
#endif
};

int main(void) {
    /* If unspecified, the first is 0. */
    assert(E0 == 0);
    assert(E1 == 1);
    /* Repeated number, no problem. */
    assert(E2 == 3);
    assert(E3 == 3);
    /* Continue from the last one. */
    assert(E4 == 4);
    assert(E5 == INT_MAX);
    return 0;
}

সংকলন এবং চালান:

gcc -std=c99 -Wall -Wextra -pedantic -o main.out main.c
./main.out

উবুন্টু 16.04, জিসিসি 6.4.0 এ পরীক্ষিত।


7

এনাম ভেরিয়েবলের প্রথম মানটি যদি আরম্ভ না করা হয় তবে সি সংকলক স্বয়ংক্রিয়ভাবে মান 0 নির্ধারণ করে The

উদাহরণ:

enum months{jan,feb,mar}

ব্যাখ্যা: জানের মান 0 হবে, ফেবের মান 1 হবে, মার্চ 2 হবে।

enum months{jan=123,feb=999,mar}

ব্যাখ্যা: জানের মান হবে 123, ফেব হবে 999, মার্চ হবে 1000

enum months{jan='a',feb='s',mar}

ব্যাখ্যা: জানের মান 'এ' হবে, ফেবের 'এস' হবে, মার হবে 'টি'।


1
মার্চ হওয়ার 't'নিশ্চয়তা নেই, এমন অক্ষর সেট থাকতে পারে যাতে অক্ষরগুলি ক্রমাগত বর্ণানুক্রমিক ক্রমে থাকে না
এমএম

-15

হ্যাঁ, এনাম মান বাইফেল্ট 0 থেকে শুরু করে কোনও প্ল্যাটফর্মের মূল উপাদান থেকে শুরু করুন।


14
আপনার উত্তর কীভাবে উত্তরের পুলকে যুক্ত করে তা বিবেচনা করুন। অর্থাৎ, আপনার নতুন উত্তরটি (5 বছর পরে) কীভাবে এমন নতুন কিছু যুক্ত করবে যা অন্য উত্তরে coveredাকা হয়নি? প্রথম নজরে, এটি অন্য দুটি উত্তরের চেয়ে কম তথ্যবহুল বলে মনে হচ্ছে।
হালফুল এভিল

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