Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.10.18;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.016 c
2-1250834158
ford
2009-08-21 09:55
2009.10.18
TRxDBRichEdit не выводит popupmenu


2-1250758059
cross
2009-08-20 12:47
2009.10.18
004A6FF4, D96F?


15-1250195405
Юрий
2009-08-14 00:30
2009.10.18
С днем рождения ! 14 августа 2009 пятница


11-1206625817
andreil
2008-03-27 16:50
2009.10.18
Проблема с видимостью элементов :(


11-1200751243
Vladimir Kladov
2008-01-19 17:00
2009.10.18
Версия 2.86