PDA

View Full Version : مبتدی: switch و if-else-if



قله بلند
پنج شنبه 12 آذر 1388, 13:51 عصر
با سلام

تفاوت switch و if-else-if در دو قطعه کد زیر از منظر کامپایلر در چیست؟
در جایی نوشته بود که: کامپایلر جاوا هنگامیکه یک دستور switch را کامپایل می کند به هر یک از ثابت های case سرکشی نموده و یک جدول jump table می سازد. بنابراین اگر می خواهید از گروه بزرگی از مقادیر انتخاب نمایید، یک دستور switch نسبت به یک ترتیب از if-else ها که به صورت معادل و منطقی کدبندی شده باشد، بسیار سریعتر اجرا خواهد شد.
سوال: مگر تمامی دستورات یک برنامه توسط کامپایلر تفسیر و کد گذاری نمی شوند؟ مگر وجود این جدول نیز خود تفسیری برای کامپایلر نیست؟
public class MissingBreak
{
public static void main(String args[])
{
int i=3;
switch(i)
{
case 0:
System.out.println("i is 0");
break;
case 1:
System.out.println("i is 1");
break;
case 2:
System.out.println("i is 2");
break;
case 3:
System.out.println("i is 3");
break;
default:
System.out.println("Error");
}
}
}

public class MissingBreak
{
public static void main(String args[])
{
int i=3;
if(i==0)
System.out.println("i is 0");
else if(i==1)
System.out.println("i is 1");
else if(i==2)
System.out.println("i is 2");
else if(i==3)
System.out.println("i is 3");
else
System.out.println("Error");
}
}

persianshadow
پنج شنبه 12 آذر 1388, 14:38 عصر
کمپایلر جاوا با دستور switch دو نوع برخورد میکنه اگر رنج اعدادی که به عنوان case معرفی می‌شن

نزدیک به هم باشن کامپایلر از روش tableswitch استفاده می‌کنه و اگه رنج اعداد اختلاف زیادی داشته

باشه از روش lookupswitch. منظور از این دو روش اینه که در روش اول دقیقآ یک jump table شکل می‌گیره

که مختص دستور switch نیست بلکه کلآ کامپایلرها از این جدول برای کنترل اجرای قطعه‌ کدهای برنامه‌ها

استفاده می‌کنند که از زبان C به این طرف معمول بوده.در روش بعدی هم که کامپایلر برای زودتر به نتیجه

رسیدن دقیقآ عددها رو مقایسه می‌کنه.اما اینکه آیا دستور switch با if-else از لحاظ سرعت متفاوت هست

خیر اینطور نیست.کاربرد این دو متفاوته مثلآ شما تنها اعداد integer رو می‌تونید به switch بدید و switch

هم تنها می‌توند از عملگر تساوی استفاده کنند در صورتی که در if -else و مابقی مشتقاتش شما می‌تونید

عملگرهای مختلفی رو به کار ببرید و از اون مهم‌تر رشته‌ها رو با هم مقایسه کنید چیزی که switch نداره.

البته در JDK7 به نظر قراره این قابلیت به دستور switch افزوده بشه.از لحاظ کدنویسی هم switch خیلی

بهتر هست هم به خوانایی کدها کمک می‌شه و هم اینکه موقع اصلاح کردن کد می‌شه راحت اون رو

اصلاح کرد.اما درباره تفسیر این دستوارت.بله jump table هنگام اجرا تشکیل می‌شه یعنی از روی کدباینری

چه برای if-else و چه برای switch یعنی هر دو از این خاصیت بهره میبرن.

قله بلند
جمعه 13 آذر 1388, 11:56 صبح
با سلام
می بخشید راجع به پاسخی که دادید من چند سوال برایم ایجاد شد.
شما فرمودید: کمپایلر جاوا با دستور switch دو نوع برخورد میکنه اگر رنج اعدادی که به عنوان case معرفی می‌شن نزدیک به هم باشن کامپایلر از روش tableswitch استفاده می‌کنه و اگه رنج اعداد اختلاف زیادی داشتهباشه از روش lookupswitch.
سوال: منظور شما اینه که مثلاً اگر اعدادی که قرار است مقایسه شوند مثلاً از 1 تا 10 باشند کامپایلر از روش tableswitch ولی اگر محدوده اعداد مثلاً از 1 تا 1000 باشند از lookupswitch استفاده می کند.
سوال: tableswitch یعنی اینکه پله پله مقایسه می کند تا برسد به جواب و lookupswitch یعنی اینکه جستجو می کنه و یکدفعه ای می پره به نقطه مورد نظر نه اینکه پله پله بیاد. اگر جواب شما به این سوال مثبت باشه آیا تفسیر همیشگی کامپایلر در مورد switch بهتر نیست از نوع lookupswitch باشد؟
شما فرمودید: کاربرد این دو متفاوته مثلآ شما تنها اعداد integer رو می‌تونید به switch بدید و switch هم تنها می‌توند از عملگر تساوی استفاده کنند.
سوال: در c++ می شد کاراکترها را هم با هم مقایسه کرد یعنی می شد نوشت:
case '1':اما در جاوا فقط از اعداد صحیح استفاده می شود. پس اینهم یک تفاوت برای زبان جاوا و c++.

persianshadow
جمعه 13 آذر 1388, 12:47 عصر
روش کار jump table و lookup table به این سادگی‌ها نیست ولی اگه علاقه دارید به صورت

دقیق روش‌های پیاده سازی رو مطالعه کنید مقاله‌های زیر که از ویکی‌پدیا هست به صورت

مناسبی این موارد رو توضیح داده :


Branch table یا همان Jump table :

http://en.wikipedia.org/wiki/Branch_table

مقاله درباره lookup table

http://en.wikipedia.org/wiki/Lookup_table

و در نهایت دستور switch در زبان‌های مختلف

http://en.wikipedia.org/wiki/Switch_statement

قله بلند
جمعه 13 آذر 1388, 17:52 عصر
با سلام و تشکر
چشم حتماً به این لینک ها نگاه می کنم. پس فعلاً توی این قضیه سوالی ندارم تا لینک ها را مطالعه کنم.
باز هم ممنونم از پیگیری های شما