Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/29: Рейтинг темы: голосов - 29, средняя оценка - 4.93
 Аватар для Димон_
136 / 104 / 9
Регистрация: 30.01.2011
Сообщений: 699

В чем разница while(true) и for( ; ; )?

02.04.2011, 23:40. Показов 5800. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Вот читаю справочник по с# братьев Албахари, и наткнулся на такую странную вешь, как цикл while(true) в блоке try. Вот и появился вопрос: Какая разница в циклах while(true) и for(; ; )?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.04.2011, 23:40
Ответы с готовыми решениями:

Есть ли логическая разница между а = 1 или а = true?
Здравствуйте! Есть ли логическая разница между, если а = 1 или а = true: а = 1 а = а а = true

В чем разница?
Доброго времени суток. Разъясните, в чем разница конкретно этих примеров? private string name; public string Name ...

Equals и == в чем разница?
Собственно реализовал в классе Equals и ==; Но потом подумал, а ведь это одно и то же. То зачем описывать полностью == Если можно...

2
145 / 145 / 26
Регистрация: 09.10.2009
Сообщений: 261
02.04.2011, 23:52
В плане результата - разницы никакой. В плане специфики работы - пройдитесь дебаггером и посмотрите: while делает дополнительную проверку условия, for - нет, т.к. самих условий тоже нет.
1
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
03.04.2011, 00:31
Лучший ответ Сообщение было отмечено как решение

Решение

ArtOfLife, ты не прав - они оба не делают проверки, т.к. это одни и те же циклы, которые используют безусловный переход по метке.

UPD:
Отступление (from reflector)
В зависимости от тела цикла, компилятор будет их оптимизировать и вывод в рефлекторе будет такой:


Если так:
C#
1
2
for(;;) { }
while(true) { }
То компилятор оптимизирует в переход по метке (goto тот же)
C#
1
2
3
4
5
6
7
8
9
10
11
.method private hidebysig instance void FOR() cil managed
{
    .maxstack 8
    L_0000: br.s L_0000
}
 
.method private hidebysig instance void WHILE() cil managed
{
    .maxstack 8
    L_0000: br.s L_0000
}


Если же так:
C#
1
2
3
4
5
6
7
8
9
        void FOR() {
            int i = 0;
            for(;;) { i++; }
        }
 
        void WHILE() {
            int i = 0;
            while(true) { i++; }
        }
то в результате компилятор выдаст
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
.method private hidebysig instance void FOR() cil managed
{
    .maxstack 2
    .locals init (
        [0] int32 i)
    L_0000: ldc.i4.0 
    L_0001: stloc.0 
    L_0002: ldloc.0 
    L_0003: ldc.i4.1 
    L_0004: add 
    L_0005: stloc.0 
    L_0006: br.s L_0002
}
 
.method private hidebysig instance void WHILE() cil managed
{
    .maxstack 2
    .locals init (
        [0] int32 i)
    L_0000: ldc.i4.0 
    L_0001: stloc.0 
    L_0002: ldloc.0 
    L_0003: ldc.i4.1 
    L_0004: add 
    L_0005: stloc.0 
    L_0006: br.s L_0002
}


Если вообще так:
C#
1
2
3
4
5
6
7
8
9
        void FOR() {
            int i = 0;
            for(;;) { if (File.Exists(i++.ToString())) break; }
        }
 
        void WHILE() {
            int i = 0;
            while(true) { if (File.Exists(i++.ToString())) break; }
        }
то в результате будет так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
.method private hidebysig instance void FOR() cil managed
{
    .maxstack 3
    .locals init (
        [0] int32 i,
        [1] int32 CS$0$0000)
    L_0000: ldc.i4.0 
    L_0001: stloc.0 
    L_0002: ldloc.0 
    L_0003: dup 
    L_0004: ldc.i4.1 
    L_0005: add 
    L_0006: stloc.0 
    L_0007: stloc.1 
    L_0008: ldloca.s CS$0$0000
    L_000a: call instance string [mscorlib]System.Int32::ToString()
    L_000f: call bool [mscorlib]System.IO.File::Exists(string)
    L_0014: brfalse.s L_0002
    L_0016: ret 
}
 
.method private hidebysig instance void WHILE() cil managed
{
    .maxstack 3
    .locals init (
        [0] int32 i,
        [1] int32 CS$0$0000)
    L_0000: ldc.i4.0 
    L_0001: stloc.0 
    L_0002: ldloc.0 
    L_0003: dup 
    L_0004: ldc.i4.1 
    L_0005: add 
    L_0006: stloc.0 
    L_0007: stloc.1 
    L_0008: ldloca.s CS$0$0000
    L_000a: call instance string [mscorlib]System.Int32::ToString()
    L_000f: call bool [mscorlib]System.IO.File::Exists(string)
    L_0014: brfalse.s L_0002
    L_0016: ret 
}


Из этого
C#
1
2
3
4
5
6
7
8
9
        void FOR() {
            int i = 0;
            for(;;) { if (File.Exists(i.ToString())) i++; }
        }
 
        void WHILE() {
            int i = 0;
            while(true) { if (File.Exists(i.ToString())) i++; }
        }
получается это
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
.method private hidebysig instance void FOR() cil managed
{
    .maxstack 2
    .locals init (
        [0] int32 i)
    L_0000: ldc.i4.0 
    L_0001: stloc.0 
    L_0002: ldloca.s i
    L_0004: call instance string [mscorlib]System.Int32::ToString()
    L_0009: call bool [mscorlib]System.IO.File::Exists(string)
    L_000e: brfalse.s L_0002
    L_0010: ldloc.0 
    L_0011: ldc.i4.1 
    L_0012: add 
    L_0013: stloc.0 
    L_0014: br.s L_0002
}
 
.method private hidebysig instance void WHILE() cil managed
{
    .maxstack 2
    .locals init (
        [0] int32 i)
    L_0000: ldc.i4.0 
    L_0001: stloc.0 
    L_0002: ldloca.s i
    L_0004: call instance string [mscorlib]System.Int32::ToString()
    L_0009: call bool [mscorlib]System.IO.File::Exists(string)
    L_000e: brfalse.s L_0002
    L_0010: ldloc.0 
    L_0011: ldc.i4.1 
    L_0012: add 
    L_0013: stloc.0 
    L_0014: br.s L_0002
}

Как видно IL один и тот же без проверок, а идёт сразу переход на метку.
4
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.04.2011, 00:31
Помогаю со студенческими работами здесь

В чем разница между new и override?
разница между new и override?

BeginAcceptTcpClient и AcceptTcpClient: в чем разница
На сайте msdn есть такой пример с использованиям BeginAcceptTcpClient: // Thread signal. public static ManualResetEvent...

Классы и структуры: в чем разница?
Здравствуйте, подскажите в чем разница между структурой и классом? и то и другое абсолютно однаковый имеют синтаксис, обращение с ними...

Экземпляр и объект, в чем разница?
Цитата из книги «Полный справочник по С#»Г.Шилдт До этого я думал что экземпляр класса и объект класса это одно и тоже. Объясните...

В чем разница между несколькими if и if + else if?
зачем нужно if else? читал для удобства пишут. if(..){} else if(..){} else можно записать так: if(..)


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru