Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2009.10.18;
Скачать: [xml.tar.bz2];

Вниз

"Феня" компилятора   Найти похожие ветки 

 
AndreyRus ©   (2009-08-16 13:37) [0]

Обнаружил следующую строку в иследуемом коде

Result:= С = GetChecksum(s);


Сроду такого не видал...
Правильно ли я понимаю, что этот код значит:

Result:= false;
if С = GetChecksum(s) then Result:= true;


 
KilkennyCat ©   (2009-08-16 13:41) [1]

скорее if С = GetChecksum(s) then Result := true else Result := false;


 
Kolan ©   (2009-08-16 13:52) [2]

Сравнения возвращают булево значение, с ним можно делать все что угодно, в данном случае положить в переменную Result.


 
Palladin ©   (2009-08-16 13:54) [3]


> AndreyRus ©   (16.08.09 13:37)

и что же удивительного в том что Boolean переменной назначается Boolean результат? не вижу в этом никакой "особенной фени". Почему ты не удивляешься что c:=a-b; ?


 
sniknik ©   (2009-08-16 13:56) [4]

> Сроду такого не видал...
как много нам открытий чудных ...

вообще то такая запись гораздо более нормальна, и , имхо, чаще встречается чем вариант с if else.
даже анекдот есть на эту тему - типа, только программист может решить уже решенную задачу, вот например чему равно 2 + 2 = 4 ?... естественно true!
а тут это труе и присваивается.


 
Palladin ©   (2009-08-16 14:02) [5]


> как много нам открытий чудных ...

Он еще больше открытий чудных сделает, почитав хотя бы учебники по Турбо Паскалю... Эта "особенная феня" и там есть...


 
Anatoly Podgoretsky ©   (2009-08-16 14:22) [6]

> AndreyRus  (16.08.2009 13:37:00)  [0]

Гениально

if true then Result:= true;


 
TIF ©   (2009-08-16 14:37) [7]

> Обнаружил следующую строку в иследуемом кодеResult:= С =
> GetChecksum(s);

Ну это только на первый взгляд выглядит необычно :)


 
SPeller ©   (2009-08-16 14:59) [8]

надо логическую операцию в скобки брать, тогда нагляднее будет


 
TUser ©   (2009-08-16 22:36) [9]

Насчет нагляднее можно поспорить, потому что я сам так пишу иногда.

:)


 
antonn ©   (2009-08-16 22:39) [10]

а я никогда не писал так, отчасти потому что не знал, да если бы и знал - все равно не писал бы, if then нагляднее, а это важнее -1 одной строчки :)


 
TUser ©   (2009-08-16 22:50) [11]

Но тернарный оператор - это еще большее зло.


 
скучающий кодер   (2009-08-16 22:54) [12]

antonn, тебе просто кажется, что это не наглядно. на самом деле наглядно. ещё и как. или зачем в сишкином синтаксисе тернарный оператор?


 
antonn ©   (2009-08-16 22:55) [13]

я не использую сишный синтаксис. в пхп иногда использую, в дельфи только if then


 
DVM ©   (2009-08-16 23:00) [14]


> AndreyRus ©


> Сроду такого не видал...

Ты еще Си не видел. :) Там более увлекательно, есть == и есть =


 
скучающий кодер   (2009-08-16 23:03) [15]

а вот в VCL используется иммитация сишного тернарника, можно поискать по "array[boolean]", причём настоящий тернарник был бы только удобнее.


 
TUser ©   (2009-08-16 23:05) [16]


> причём настоящий тернарник был бы только удобнее

байт-код, наверное, еще удобнее, но вроде этот текст для людей, а компилятору ничего не будет, он железный :)


 
Petr V. Abramov ©   (2009-08-16 23:10) [17]


> Result:= С = GetChecksum(s);

я б написал Result:= (С = GetChecksum(s));
хотя скобки абсолютно необязательны.
просто для наглядности.

P.S.
if (С = GetChecksum(s)) = true then Result := true else Result := false


 
Дмитрий Белькевич   (2009-08-17 02:58) [18]


> причём настоящий тернарник был бы только удобнее.


Ну он как бы есть - IfThen. Правда, не всегда удобен, т.к. реализован как функция, а не как compliler magic, из-за чего обязательно должны высчитываться оба параметра, что есть не всегда хорошо.


> Result:= С = GetChecksum(s);


Я так пишу всегда.


 
TIF ©   (2009-08-17 03:00) [19]

> Ты еще Си не видел. :) Там более увлекательно, есть == и
> есть =

PHP круче, там есть === :)


 
test ©   (2009-08-17 05:43) [20]

DVM ©   (16.08.09 23:00) [14]
return c = c == GetChecksum(s);


 
Дмитрий С ©   (2009-08-17 07:00) [21]

А так в Си можно?


procedure TForm2.Edit1Change(Sender: TObject);
var
 Edit: TEdit absolute Sender;
begin
 Edit.SelStart := Edit.SelStart - 1;
end;

function TForm2.ContrastColor(C: TColor): TColor;
var
 Src: TRGBQuad absolute C;
begin
 if (Src.rgbBlue + Src.rgbGreen + Src.rgbRed) div 3 > 0 then
   Result := clBlack
 else
   Result := clWhite;
end;

function TForm2.SwapChanells(C: TColor): TColor;
var
 Src: TRGBQuad absolute C;
 Dst: TRGBQuad absolute Result;
begin
 Dst.rgbBlue := Src.rgbGreen;
 Dst.rgbGreen := Src.rgbRed;
 Dst.rgbRed := Src.rgbBlue;
end;



 
test ©   (2009-08-17 07:38) [22]

Дмитрий С ©   (17.08.09 07:00) [21]
lol


 
palva ©   (2009-08-17 08:44) [23]


> PHP круче, там есть === :)

Кстати да. Там следующая проверка является рутинной:
if ($res === FALSE) ...
и это оправдано, потому что там $res, являясь, к примеру, пустой строкой или нулем, не является FALSE, но при выполнении логических операций расцениваться как FALSE.


 
Дмитрий Белькевич   (2009-08-17 11:20) [24]


> А так в Си можно?


Лучше бы так и в Паскале/Делфи нельзя было ;) Хотя изредка пользую...


function TMedicalFile.Read32Float: Single;
var
Temp: Integer absolute Result;
begin
Temp := Read32;
end;


 
СовестьДМ ©   (2009-08-17 11:27) [25]


> Дмитрий С ©   (17.08.09 07:00) [21]
> А так в Си можно?

практическая проктология?


 
Kolan ©   (2009-08-17 11:32) [26]

Интересно, что когда я пишу, то у меня в голове сначала формируется конструкция вида if С = GetChecksum(s) = true then Result := true else Result := false, а потом я её превращаю в Result:= С = GetChecksum(s);. Причем часто я сначала начинаю писать вариант с if, а потом понимаю, что это идиотизм и переписываю.

Из опыта — краткая запись не вызывает проблем.


 
DVM ©   (2009-08-17 11:35) [27]


> test ©   (17.08.09 05:43) [20]
>
> DVM ©   (16.08.09 23:00) [14]
> return c = c == GetChecksum(s);

вот вот, я именно об этом.


 
Юрий Зотов ©   (2009-08-17 11:41) [28]

> Дмитрий С ©   (17.08.09 07:00) [21]

> function TForm2.ContrastColor(C: TColor): TColor;
> var
>  Src: TRGBQuad absolute C;
> begin
>  if (Src.rgbBlue + Src.rgbGreen + Src.rgbRed) div 3 > 0
> then
>    Result := clBlack
>  else
>    Result := clWhite;
> end;

Недостаточно извращаетесь, коллега. Настоящие извращенцы пишут так:
Result := BOOL ((Src.rgbBlue + Src.rgbGreen + Src.rgbRed) div 3)


 
Игорь Шевченко ©   (2009-08-17 11:48) [29]

Программу на Фортране можно написать на любом языке программирования


 
Кто б сомневался ©   (2009-08-17 12:25) [30]

Да вообще то так и надо писать.
Обычно пишут  Result := MyFunc;
а не
If MFunc then
 Result := true
else
 Result:= False

Последний вариант пишут новички, это значит что ты еще новичок.
Рекомендация - читать исходники опытных людей, к примеру vcl.


 
Дмитрий С ©   (2009-08-17 12:58) [31]


> If MFunc then
>  Result := true
> else
>  Result:= False

эта запись не аналогична предыдущей. К примеру, если myfunct возвращает тип variant и не булевское значение, а result это вариант в который нужно вернуть именно булевское значение. Можно, конечно и приведением типа, но и такая запись будет оравдана.

Можно и так
result := foo() and bar().
В •Общем• случае если foo ложно, то bar не выполниться даже.


 
@!!ex ©   (2009-08-17 13:07) [32]

> [31] Дмитрий С ©   (17.08.09 12:58)

Она еще не аналогична хотя бы потому, что константа true имеет фиксированное значение, а результат выполнения булевской функции имеет значение not false, который может и не быть равен константе true.


 
Anatoly Podgoretsky ©   (2009-08-17 13:54) [33]

И где же здесь булевская функция

Result := С = GetChecksum(s);


 
Кто б сомневался ©   (2009-08-17 14:16) [34]


> Дмитрий С ©   (17.08.09 12:58) [31]


Нет, она абсолютно аналогична примеру автора. MyFunc это и есть "С = GetChecksum(s)". Такой же порядок работы.
Все остальное несущественные мелочи реализации.


 
@!!ex ©   (2009-08-17 14:29) [35]

> [33] Anatoly Podgoretsky ©   (17.08.09 13:54)

= - это что по вашему? Не булева операция?


 
Anatoly Podgoretsky ©   (2009-08-17 14:35) [36]


> = - это что по вашему? Не булева операция?

Ай как не хорошо карты передергивать! У меня булевская функция


 
@!!ex ©   (2009-08-17 14:41) [37]

> [36] Anatoly Podgoretsky ©   (17.08.09 14:35)

Нефиг к словам цеплять. И так понятно что я имел ввиду.
функция или оператор - не имеет значения в контексте моих слов.
Если вам хочеться показать какой вы умный - делайте это на ком нибудь другом, желательно в более подходящем случае.


 
Anatoly Podgoretsky ©   (2009-08-17 14:52) [38]

> @!!ex  (17.08.2009 14:41:37)  [37]

Имеет значени, речь шла именно о функции, а оператор сравнения всегда даст результат Boolean/
И чего ты, в очередной раз, на дыбы полез, не любишь, когда тебе указывают на явные ошибки, особенно детские, так не надо открывать рот на публичных адреса и не думай, что у меня не хватит силы воли закрыть тебя на долго, я таким не страдаю и закрываю независимо от того, на кого бы наезжаешь.


 
@!!ex ©   (2009-08-17 14:52) [39]

> [38] Anatoly Podgoretsky ©   (17.08.09 14:52)

Учите матчасть:
http://ru.wikipedia.org/wiki/Булева_функция

= - это тождественная буллева функция


 
KilkennyCat ©   (2009-08-17 14:53) [40]


> Учите матчасть:

по википедии?!



Страницы: 1 2 3 вся ветка

Форум: "Прочее";
Текущий архив: 2009.10.18;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.006 c
15-1249653864
Kerk
2009-08-07 18:04
2009.10.18
WiFI в Питере


15-1250014166
Kerk
2009-08-11 22:09
2009.10.18
Все-таки есть бритвы, а есть Бритвы...


2-1249568385
caps14
2009-08-06 18:19
2009.10.18
перемещение изображений по форме


15-1250594396
Vera
2009-08-18 15:19
2009.10.18
JvComponentBase


15-1250541003
Юрий
2009-08-18 00:30
2009.10.18
С днем рождения ! 18 августа 2009 вторник





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский