আমি কীভাবে সি ++ ব্যবহার করে এক লাইনে একাধিক ভেরিয়েবল ঘোষিত ও সংজ্ঞা দিতে পারি?


172

আমি সর্বদা যদিও আমি যদি এই তিনটি ভেরিয়েবল ঘোষণা করি যে তাদের সকলের মান 0 হবে

int column, row, index = 0;

তবে আমি দেখতে পাচ্ছি যে কেবল সূচকটি শূন্যের সমান এবং অন্যগুলি 844553 এবং 2423445 এর মতো আবর্জনাযুক্ত।

নতুন লাইনে প্রতিটি ভেরিয়েবল ঘোষণা না করে আমি কীভাবে এই সমস্ত ভেরিয়েবল শূন্যে শুরু করতে পারি?


36
সেই এক-লাইন মাল্টি-ভেরিয়েবল ঘোষণার সাথে যত্নশীল। আপনি নিয়মিত পূর্ণসংখ্যার ( int* a, b, c;এটি দেখতে যেমন করেন না তেমন একটি তালিকা) এর পরে কোনও ইন পয়েন্টার ঘোষণা করার চেয়ে সহজ than
ক্রিস ইবারল

4
ডুড, =0তাদের সংজ্ঞা অনুযায়ী প্রতিটির জন্য কেবল তিনটি ভেরিয়েবল লিখুন । এবং, যদি আপনি সত্যিই অনেকগুলি ভেরিয়েবল চান, তবে একটি অ্যারের চেষ্টা করুন: আপনার জন্য int a[10]={0}প্রতিটিকে a[i]0 থেকে আরম্ভ করবে।
স্ট্যান

কোনও যুক্তিসঙ্গত প্রোগ্রামার তার কাছ থেকে যা প্রত্যাশা করবে তার চেয়ে আলাদা আচরণ করতে
চলেলে সংকলকটিকে

1
@ সিএফ 2117 একটি যুক্তিসঙ্গত প্রোগ্রামার ভাবেন যে ' হুঁ , ব্যাকরণ কীভাবে জিনিসগুলিকে আবদ্ধ করে তার উপর নির্ভর করে এই সিনট্যাক্সটির অর্থ কয়েকটি ভিন্ন ভিন্ন হতে পারে' , কোনটি সত্য তা খুঁজে বের করার জন্য স্ট্যান্ডার্ডটি অনুসন্ধান করুন এবং এর সাথে এগিয়ে যান।
আন্ডারস্কোর_

এটি করা বন্ধ করুন। এটি কেবল কোড পড়া শক্ত করে তোলে। একটি উচ্চ স্তরের ভাষায় কোড লেখার বিন্দুটি কোনও রক্ষণাবেক্ষণকারীকে পড়া সহজ করে তোলে।
মার্টিন ইয়র্ক

উত্তর:



161

আপনি যখন ঘোষণা করবেন:

int column, row, index = 0;

কেবল সূচকটি শূন্যে সেট করা আছে।

তবে আপনি নিম্নলিখিতটি করতে পারেন:

int column, row, index;
column = index = row = 0;

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

int column = 0, row = 0, index = 0;

অথবা

int column = 0;
int row = 0;
int index = 0;

3
শেষ দুটিটির মধ্যেই আমি সিদ্ধান্ত নিয়েছি যে দুটি মানগুলি অবশ্যই একই ধরণের হওয়া উচিত ( bool previousInputValue, presentInputValue;) বা যদি সেগুলি এখন একই ধরণের হয়ে থাকে তবে আসলে হওয়ার দরকার নেই ( ভবিষ্যতে uint8_t height, width;পরিণত হতে পারে uint8_t height; uint16_t width;এবং হওয়া উচিত ছিল) uint8_t height; uint8_t width;দিয়ে শুরু করতে).
অলটেঞ্জি

কারণ uint8_t height; uint16_t width;পরিবর্তে লিখলে uint8_t height, width;ভবিষ্যতে 10 টি অক্ষর সংরক্ষণ হয়। :-) আপনি অবশ্যই এটি করতে পারেন তবে আপনি চান। আপনি এটি সহজেই পড়তে পারেন তা নিশ্চিত করুন। সুতরাং শেষ ফর্মটি সর্বাধিক স্পষ্ট।
ম্যাট

সর্বশেষ রূপটি অবশ্যই প্রতিটি পরিবর্তনশীলের ধরণ উল্লেখ করে এবং এটি স্পষ্ট করে তোলে যে প্রত্যেকেই আরম্ভ করা হয়েছে at এটি বলেছিল, কলাম এবং সারি একই ধরণের হবে কিনা তা প্রত্যাশিত কিনা তা স্পষ্ট নয়। সম্ভবত আমরা দু'জনেরই ব্যাখ্যা int presentValue = 0; typeof(presentValue) previousValue = presentValue;দেবো, তবে আমি বিশ্বাস করি যে typeof()এটি একটি মানহীন জিসিসি এক্সটেনশান।
অলেন্ডেকি

49

@ জোশ যেমন বলেছিলেন, সঠিক উত্তরটি হ'ল:

int column = 0,
    row = 0,
    index = 0;

আপনাকে পয়েন্টারগুলির সাথে একই জিনিসটির জন্য নজর রাখা দরকার। এই:

int* a, b, c;

এর সমতুল্য:

int *a;
int b;
int c;

34
আমি সেই পয়েন্টার জিনিসটিকে ঘৃণা করি, এটি কোনও মানে করে না। তারকাচিহ্নটি এই ধরণের অংশ, সুতরাং এটি সবার সাথে প্রয়োগ করা উচিত। যদি কল্পনা unsigned long x, y;ঘোষিত xযেমন unsigned longকিন্তু yশুধু unsigned, ওরফে unsigned int! একদম একই! </ant>
ক্যাম জ্যাকসন

6
এটা বোঝা যায়। "ইনট * এ, বি, সি;"
জেরোইন

7
@ জিরোবোলেন ওয়েল হ্যাঁ, আপনি যদি টাইপটির পরিবর্তে ভেরিয়েবল নামের পাশে আপনার পয়েন্টার অস্ট্রিকগুলি লিখেন তবে এটি নিজেই অর্থবোধ করে না itself আমি উপরে যেমন বলেছি, নক্ষত্রটি প্রকারের অংশ, নামের অংশ নয়, সুতরাং এটি টাইপের সাথে দলবদ্ধভাবে হওয়া উচিত!
ক্যাম জ্যাকসন

11
পক্ষ হিসাবে না, আসলে এটি বোঝায় যে * অগত্যা টাইপের অংশ নয়, int *aমানে যে *aকোনও intমানের প্রতিনিধিত্ব করে ।
mdenton8

2
পয়েন্টটি ইতিমধ্যে তৈরি করা হয়েছে তবে কেবল এটির সাথে যুক্ত করা মূলত কোনও ধরণের অভাব তবে আপনি এখনও এটিতে পয়েন্টার তৈরি করতে পারেন। সুতরাং কেন void* aসংকলন হবে এবং void *a, b, cনা। এই যৌক্তিকরণটি আমার পক্ষে কাজ করে।
জোশ সি

24

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

আপনার প্রশ্নের সরাসরি উত্তর দেওয়ার জন্য আপনাকে প্রতিটি ভেরিয়েবলটি 0 টি স্পষ্টভাবে শুরু করতে হবে। int a = 0, b = 0, c = 0;


16
int column(0), row(0), index(0);

মনে রাখবেন যে এই ফর্মটি কাস্টম ধরণের সাথেও কাজ করবে, বিশেষত যখন তাদের নির্মাণকারীরা একাধিক যুক্তি গ্রহণ করে।


2
এবং আজকাল অভিন্ন সূচনা সহ (C ++ 17 এর জন্য এটি স্থির করে auto...): কলাম কলাম { 0 } , সারি { 0 } , সূচক { 0 } ;
আন্ডারস্কোর_১১


4

সম্ভাব্য পন্থা:

  • সমস্ত স্থানীয় ভেরিয়েবল শূন্য দিয়ে শুরু করুন।
  • একটি অ্যারে memsetবা {0}অ্যারে রাখুন।
  • এটি বৈশ্বিক বা স্থির করুন।
  • এগুলিতে রাখুন structএবং memsetঅথবা এমন কোনও নির্মাণকারী আছেন যা তাদের শূন্যে শুরু করবে।

# ডিফাইন কলম 0 # সংজ্ঞায়িত রো 1 # নির্ধারিত আইএনডেক্স 2 # নির্ধারিত এআরআইএসআইজি 3 ইন্ট ডেটা [ আরএসআইজি ]; // শুধু একটি ধারণা।
অজয়

দুঃখিত, আমি বোঝাতে চাইছিলাম, আপনি কেন আপনার উত্তরে " একটি অ্যারে, মেমসেট বা {0} অ্যারে আছে? " লাইনটি অন্তর্ভুক্ত করলেন ?
মতিন উলহাক

মেমসেট (ডেটা, 0, মাপের (ডেটা)); // যদি এটি যুক্তিযুক্তভাবে প্যাক করা যায়।
অজয়

2

আমি এটি সুপারিশ করব না, তবে আপনি যদি সত্যিই এটির এক লাইন হয়ে থাকেন এবং কেবল একবার 0 লিখে থাকেন তবে আপনি এটি করতে পারেন:

int row, column, index = row = column = 0;

0

অন্যরা যেমন উল্লেখ করেছে, সি ++ 17 থেকে আপনি একাধিক ভেরিয়েবল অ্যাসাইনমেন্টের জন্য কাঠামোগত বাইন্ডিং ব্যবহার করতে পারেন ।

এটির সাথে std::arrayএবং টেমপ্লেট যুক্তি ছাড়ের সংমিশ্রণে আমরা এমন একটি ফাংশন লিখতে পারি যা প্রকার বা মানটির পুনরাবৃত্তি না করে একটি স্বেচ্ছাসেবী সংখ্যার ভেরিয়েবলকে একটি মূল্য নির্ধারণ করে ।

#include <iostream>
#include <array>

template <int N, typename T> auto assign(T value)
{
    std::array<T, N> out;
    out.fill(value);
    return out;
}

int main()
{
    auto [a, b, c] = assign<3>(1);

    for (const auto& v : {a, b, c})
    {
        std::cout << v << std::endl;
    }

    return 0;
}

Demo


-13

আপনি যখন কোনও ভেরিয়েবলটি আরম্ভ না করেই ঘোষণা করেন, মেমরি থেকে একটি এলোমেলো সংখ্যা নির্বাচন করা হয় এবং ভেরিয়েবলটি সেই মানটিতে আরম্ভ হয়।


7
আসলে তা না. সংকলক সিদ্ধান্ত নিয়েছে যে 'এই ভেরিয়েবলটি অ্যাড্রেস
এক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্স এক্সক্লুসিজে

3
@ pm100 যদিও ভাল , এবং যে কোনো তুচ্ছ বাস্তবায়ন যে হয়রানি ব্যবহারকারীদের তার পথ থেকে সরে যেতে না ... যেটা এখনও একটি uninitialised পরিবর্তনশীল UB ব্যবহার যেমন oversimplifying এর ;-) জন্য সত্য, তাই তত্ত্ব কিছু কোন কোড সহ ঘটতে পারে সেই পরিবর্তনশীলটি সহজেই প্রোগ্রাম থেকে ছিটকে যাওয়া ব্যবহার করে - যা সম্ভবত বিশেষত যখন অপ্টিমাইজেশন খেলতে থাকে।
আন্ডারস্কোর_১

1
এই ভেরিয়েবলের মানটি ঠিকানার ঠিকানায় যা ছিল তা হ'ল অর্থাৎ জাঙ্ক।
পেড্রো ভার্নেটি

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