"ডাবল ভাল = 1" এর মধ্যে কি পার্থক্য রয়েছে? এবং "ডাবল ভাল = 1 ডি;"?


17

নিম্নলিখিত দুটি টুকরা কোডের মধ্যে কি পার্থক্য রয়েছে?

class Test {

    public readonly double Val;

    public Test(bool src) {
        this.Val = src ? 1 : 0;
    }

}

class Test {

    public readonly double Val;

    public Test(bool src) {
        this.Val = src ? 1D : 0D;
    }

}

আমি দেখতে পেয়েছি যে আমাদের কোড বেসটি লেখার দ্বিতীয় পদ্ধতি ব্যবহার করে।


আমার মাথার শীর্ষে, প্রথমটিতে লম্বা থেকে দ্বিগুণ প্রচার জড়িত।
— তানভীর বদর

2
প্রথমে দ্বিগুণ রূপান্তরিত রূপান্তর করে, দ্বিতীয় কোনও রূপান্তর করে না।
— সেরকান আরসলান

2
আপনার প্রশ্নের শিরোনাম এবং শরীরে থাকা প্রশ্নের মিল নেই, এবং দুটি প্রশ্নের পৃথক উত্তর রয়েছে।
— এরিক লিপার্ট

1
@ এরিক লিপার্ট আসলে প্রশ্নটির মূল অংশ অন্যান্য ব্যবহারকারীরা সম্পাদনা করেছেন।
— srnldai

1
@ ব্রায়ান: না, মূল পোস্টারটি সঠিক; সম্পাদনাটি প্রশ্নের অর্থ পরিবর্তন করে, যা আমি লক্ষ্য করি না। মূল প্রশ্নটি ছিল "সেখানে কি কোনও পার্থক্য আছে ...? আরও, কোনও পার্থক্য আছে ...?", আমার জোর। সরানো "আরও" ইঙ্গিত দেয় যে মূল পোস্টারটি বুঝতে পেরেছিল যে তারা দুটি প্রশ্ন জিজ্ঞাসা করছে যার বিভিন্ন উত্তর থাকতে পারে। এটি একটি খারাপ অভ্যাস; প্রশ্নগুলির আদর্শভাবে একটি প্রশ্ন জিজ্ঞাসা করা উচিত। তবে সম্পাদনাটি দেখে মনে হচ্ছে দুটি প্রশ্ন একই প্রশ্ন নয়, দুটি পৃথক প্রশ্ন নয়।
— এরিক লিপার্ট

উত্তর:


18

এখানে দুটি প্রশ্ন রয়েছে এবং তাদের বিভিন্ন উত্তর রয়েছে তা লক্ষ করা জরুরী।

তার মাঝে একটি পার্থক্য আছে কি double val = 1;এবং double val = 1D;?

নং সি # সংকলকটি স্বীকৃতি দেয় যখন কোনও পূর্ণসংখ্যার আক্ষরিক এমন প্রসঙ্গে ব্যবহৃত হয় যেখানে একটি ডাবল প্রত্যাশিত হয় এবং সংকলনের সময় এই ধরণের পরিবর্তন ঘটে, সুতরাং এই দুটি টুকরা একই কোড তৈরি করবে।

নিম্নলিখিত দুটি টুকরা কোডের মধ্যে কি পার্থক্য রয়েছে?

double Val; 
...    
this.Val = src ? 1 : 0;
---
this.Val = src ? 1D : 0D;

হ্যাঁ. নিয়ম যে পূর্ণসংখ্যা ধ্রুবক স্বয়ংক্রিয়ভাবে ডাবলস থেকে পরিবর্তিত হয় শুধুমাত্র এতে প্রয়োগ ধ্রুবক , এবং src ? ...একটি নয় ধ্রুবক । সংকলকটি পূর্বেরটিকে উত্পন্ন করবে যেমন আপনি লিখেছেন:

int t;
if (src)
  t = 1;
else
  t = 0;
this.Val = (double)t;

এবং দ্বিতীয় হিসাবে

double t;
if (src)
  t = 1D;
else
  t = 0D;
this.Val = t;

এটি, প্রথমটিতে আমরা একটি পূর্ণসংখ্যা নির্বাচন করি এবং তারপরে এটিকে দ্বিগুণ রূপান্তর করি এবং দ্বিতীয়টিতে আমরা একটি ডাবল বেছে নিই।

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


6

সেখানে হয় উত্পন্ন আইএল কোড মধ্যে একটি পার্থক্য।

এই বর্গ:

class Test1
{
    public readonly double Val;

    public Test1(bool src)
    {
        this.Val = src ? 1 : 0;
    }
}

কনস্ট্রাক্টরের জন্য এই আইএল কোডটি উত্পাদন করে:

.class private auto ansi beforefieldinit Demo.Test1
    extends [mscorlib]System.Object
{
    .field public initonly float64 Val

    .method public hidebysig specialname rtspecialname instance void .ctor (
            bool src
        ) cil managed 
    {
        IL_0000: ldarg.0
        IL_0001: call instance void [mscorlib]System.Object::.ctor()
        IL_0006: ldarg.0
        IL_0007: ldarg.1
        IL_0008: brtrue.s IL_000d

        IL_000a: ldc.i4.0
        IL_000b: br.s IL_000e

        IL_000d: ldc.i4.1

        IL_000e: conv.r8
        IL_000f: stfld float64 Demo.Test1::Val
        IL_0014: ret
    }
}

এবং এই শ্রেণি:

class Test2
{
    public readonly double Val;

    public Test2(bool src)
    {
        this.Val = src ? 1d : 0d;
    }
}

কনস্ট্রাক্টরের জন্য এই আইএল কোডটি উত্পাদন করে:

.class private auto ansi beforefieldinit Demo.Test2
    extends [mscorlib]System.Object
{
    .field public initonly float64 Val

    .method public hidebysig specialname rtspecialname instance void .ctor (
            bool src
        ) cil managed 
    {
        IL_0000: ldarg.0
        IL_0001: call instance void [mscorlib]System.Object::.ctor()
        IL_0006: ldarg.0
        IL_0007: ldarg.1
        IL_0008: brtrue.s IL_0015

        IL_000a: ldc.r8 0.0
        IL_0013: br.s IL_001e

        IL_0015: ldc.r8 1

        IL_001e: stfld float64 Demo.Test2::Val
        IL_0023: ret
    }
}

আপনি দেখতে পাচ্ছেন, প্রথম সংস্করণে এটি conv.r8একটি ডাবল মধ্যে একটি int রূপান্তর কল করতে হবে।

তবে: (১) শেষ ফলাফলটি অভিন্ন এবং (২) জেআইটি সংকলক উভয়কে একই মেশিন কোডে ভালভাবে অনুবাদ করতে পারে।

তাই এর জবাব হচ্ছে, হ্যাঁ, হয় - কিন্তু না যে এক আপনার সম্পর্কে চিন্তা করতে হবে একটি পার্থক্য।

ব্যক্তিগতভাবে, আমি দ্বিতীয় সংস্করণে যাব কারণ এটি প্রোগ্রামারের অভিপ্রায়টি আরও ভালভাবে প্রকাশ করে এবং খুব সামান্য আরও কার্যকর কোড তৈরি করতে পারে (জেআইটি সংকলক কীসের উপর নির্ভর করে)।


4

কোনও পার্থক্য নেই, সংকলক জড়িতভাবে রূপান্তর করতে পারে কিনা তা যথেষ্ট স্মার্ট।
তবে, আপনি যদি ব্যবহার করেন তবে আপনার ভেরিয়েবলটি দ্বিগুণ এবং কোনও int নয় তা নিশ্চিত করার জন্য varআপনাকে লিখতে var val = 42D;হবে।

double foo = 1;  // This is a double having the value 1
double bar = 1d; // This is a double having the value 1

var val = 42d;   // This is a double having the value 42
var val2 = 42;   // /!\ This is an int having the value 42 !! /!\
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.