powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
17 сообщений из 67, страница 3 из 3
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951509
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ
А сишников с первого класса учат, что сравнивать с true нельзя

Действительно, при проверке булевой переменной
Код: pascal
1.
2.
  if b then
  if not b then

всегда производится сравнение с $00, в отличие от...

Но если уж очень хочется сравнивать с True, то вместо конструкции
Код: pascal
1.
2.
3.
  if b = True then
  cmp byte ptr [b],$01  // а ведь значение ячейки памяти может быть не 0 и не 1
  jz ...


всегда лучше сравнивать с False
Код: pascal
1.
2.
3.
  if b <> False
  cmp byte ptr [b],$00  // в этом варианте сравнивается с нулем
  jnz ...


Впрочем, все же лучше выявить причину, почему в булевой переменной не 0 и не 1.
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951510
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergi
Да, всё дело оказалось в булевских переменных.

Причина оказалось в том, что в какой-то булевой переменной содержится не 0 и не 1?
Тогда замена boolean на integer - по сути, шило на мыло.
Лучше найти причину, почему значение булевой переменной не 0 и не 1.
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951511
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov
Лучше найти причину, почему значение булевой переменной не 0 и не 1.
95% за то что он их тупо не инициализирует.
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951524
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
Polesov
Лучше найти причину, почему значение булевой переменной не 0 и не 1.
95% за то что он их тупо не инициализирует.

Вроде бы речь шла о глобальных переменных, а они инициализируются.

Гораздо хуже, если где-нибудь ошибочное явное приведение типа.
В этом случае даже переименование переменных может не помочь.
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951525
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov
Вроде бы речь шла о глобальных переменных, а они инициализируются.

Как мы недавно обнаружили в старых версиях дельфи - не всегда.
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951532
DarkMaster
Классы + глобали под запретом уже? Это с какого перепугу-то?


С того момента, когда начинают глобальные переменные не по назначению использовать. Вся логика кладётся на какие - то глобальные переменные, а не переменные - созданного экземпляра класса. Что нарушает логику и создаёт дыры в программе.

Зачем тогда вообще использовать в таком случае, объектно-ориентированное программирование

[quot Polesov#22122849]всегда производится сравнение с $00, в отличие от...[/src]

Да какая разница что с чем сравнивается ? Я уже давно написал, что можно сравнивать с чем угодно.

Но это похоже на баг в компиляторе , ибо тут в любом случае должна быть проверка посредством команды в случае true = (test с je) \ false = (test и jne)
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951535
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951540
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
Как мы недавно обнаружили в старых версиях дельфи - не всегда.

22110796
Это обсуждение?
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951542
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
Но это похоже на баг в компиляторе
Почему такой вывод?

ВсеРазумныйв любом случае должна быть проверка посредством команды в случае true = (test с je) \ false = (test и jne)
Согласен с тем, что test оптимальнее cmp, но логика от этого не меняется.
Или что?
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951545
Polesov,

Ещё как вариант, лень программистов. Boolean не может иметь не 1 и не 0. По этому всегда компиляторы генерят test X, X

А тут Delphi программисты решили схитрить, и приравнять к байту. А возможно и баг.
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951546
У кого есть лазарус, могут проверить как там с этим делом обстоит?
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951550
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov
rgreat
Как мы недавно обнаружили в старых версиях дельфи - не всегда.

22110796
Это обсуждение?
Ага.
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951551
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВсеРазумный
...
С того момента, когда начинают глобальные переменные не по назначению использовать. Вся логика кладётся на какие - то глобальные переменные, а не переменные - созданного экземпляра класса. Что нарушает логику и создаёт дыры в программе.

Зачем тогда вообще использовать в таком случае, объектно-ориентированное программирование

...

Памас, ты?
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951552
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
Polesov,

Ещё как вариант, лень программистов

Скорее уж, формальный подход.
Проверяем логическое значение - сравниваем с нулем (через test или cmp - не суть)
Сравниваем с True или False - сравниваем с 1 или 0 соответственно.
Как по мне, так это правильно.
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951555
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
Polesov
пропущено...

22110796
Это обсуждение?
Ага.

На мой взгляд, переменные, объявленные в теле dpr - особый вид глобальных переменных.
Можно их, конечно, передать куда-либо по указателю, но какова целесообразность этого?
Впрочем, на практике может быть все, что угодно )
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951560
Polesov,

Ну как сказать, 36 строк генерирует данный код

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
var
  g, v, c: Boolean;

function Test(num, x, j: Boolean): Integer; cdecl;
begin
  g := num = j;
  v := j and x;

  if v then
    c := g
  else
    c := ((v and g) or (x and not g)) and j;

  if c then
    Result := 10
  else
    Result := 30;
end;




Код: sql
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.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
.13: begin
push ebp
mov ebp,esp
mov eax,[ebp+$10]
mov edx,[ebp+$0c]

.14: g := num = j;
cmp al,[ebp+$08]
setz byte ptr [$004258dc]

.15: v := j and x;
mov ecx,eax
and cl,dl
mov [$004258dd],cl

.17: if v then
cmp byte ptr [$004258dd],$00
jz $0041b278

.18: c := g
movzx eax,[$004258dc]
mov [$004258de],al
jmp $0041b2a3

.20: c := ((v and g) or (x and not g)) and j;
movzx ecx,[$004258dd]
and cl,[$004258dc]
jnz $0041b294
test dl,dl
jz $0041b298
cmp byte ptr [$004258dc],$00
jnz $0041b298
test al,al
jnz $0041b29c
xor eax,eax
jmp $0041b29e
mov al,$01
mov [$004258de],al

.22: if c then
cmp byte ptr [$004258de],$00
jz $0041b2b3

.23: Result := 10
mov eax,$0000000a
pop ebp
ret 

.25: Result := 30;
mov eax,$0000001e

.26: end;
pop ebp
ret 
mov eax,eax



Без комментариев
Код: sql
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.
push ebp
mov ebp,esp
mov eax,[ebp+$10]
mov edx,[ebp+$0c]
cmp al,[ebp+$08]
setz byte ptr [$004258dc]
mov ecx,eax
and cl,dl
mov [$004258dd],cl
cmp byte ptr [$004258dd],$00
jz $0041b278
movzx eax,[$004258dc]
mov [$004258de],al
jmp $0041b2a3
movzx ecx,[$004258dd]
and cl,[$004258dc]
jnz $0041b294
test dl,dl
jz $0041b298
cmp byte ptr [$004258dc],$00
jnz $0041b298
test al,al
jnz $0041b29c
xor eax,eax
jmp $0041b29e
mov al,$01
mov [$004258de],al
cmp byte ptr [$004258de],$00
jz $0041b2b3
mov eax,$0000000a
pop ebp
ret
mov eax,$0000001e
pop ebp
ret 
mov eax,eax



Аналогичный код на Сях под клангом 10
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
bool g, v, c;

int Test(bool num, bool x, bool j) {
  g = num == j;
  v = g && x;
  if(v) {
    c = g;
  } else 
    c = ((v and g) or (x and ! g)) and j;

  return c ? 10 : 30;
}



23 строчки

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
	push    esi
	mov     cl, byte ptr [esp + 16]
	mov     dl, byte ptr [esp + 8]
	mov     al, byte ptr [esp + 12]
	xor     dl, cl
	mov     ah, dl
	xor     ah, 1
	mov     byte ptr [g], ah
	movzx   esi, ah
	and     ah, al
	and     al, cl
	and     al, dl
	test    ah, ah
	mov     byte ptr [v], ah
	mov     edx, 30
	movzx   ecx, al
	mov     eax, 10
	cmovne  ecx, esi
	test    cl, cl
	mov     byte ptr [c], cl
	cmove   eax, edx
	pop     esi
	ret




Ну видно Delphi что - то известнее.
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951563
Лазарус вообще компилирует испанский стыд, на агрессивной оптимизации. Delphi не такой уж и плохой компилятор как я думал
...
Рейтинг: 0 / 0
17 сообщений из 67, страница 3 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]