powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
67 сообщений из 67, показаны все 3 страниц
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39950830
Sergi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если в if стоит два and, то всё нормально. Я так думаю, что и выделение с скобки отдельных частей вышеуказанной конструкции будет работать, вот так -
if (((a=true) and (b=true)) and (c=true))
Хотя, кто знает?
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39950834
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergi
Если в if стоит два and, то всё нормально. Я так думаю, что и выделение с скобки отдельных частей вышеуказанной конструкции будет работать, вот так -
if (((a=true) and (b=true)) and (c=true))
Хотя, кто знает?


Почему решил, что не работает? Что показывает отладчик на конструкции :

if (a and b and c) then ... ?

Ну и да - директивы B+ / B- в помощь.
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39950850
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пятничный стёб ?
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39950857
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
конечно, стеб - там 2 and
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39950866
Sergi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уточнение.
Ну да, конечно, два and и три условия выполнения. Сорри. Не проснулся еще.
Конструкция из двух and и трёх условий не выполняется, а сама программа компилируется и работает. Отдельные условия внутри if выполняются на 100%. Приходится вначале делать проверку на два and, потом проверять последнее сравнение. Когда разделяю, всё выполняется.
Как так может быть?
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39950867
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergi> Как так может быть?

Так это в честь пятницы или всерьёз?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39950871
Sergi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всерьёз. Я выше уточнил вопрос.
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39950875
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergi,

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

Например, ты со скобками запутался. Причин может быть много.
Но код, который "не работает", ты не показал. Да и текст "ошибки" хранишь в секрете.
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39950880
Sergi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Никакого кода ошибки не выдаётся, просто общий результат if - отрицательный, то есть не выполняется. А пример стоит в заголовке темы.
Исходный код такой. За два выполнения процедуры мне надо отработать два условия if:
var a,b,c: boolean;
begin
if ((a=false) or (b=false) or (c=false)) then
begin a:=true; b:=true; c:=true end else
if ((a=true) and (b=true) and (c=true)) then
showmessage('!!');
end;
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39950881
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergi
Никакого кода ошибки не выдаётся, просто общий результат if - отрицательный, то есть не выполняется. А пример стоит в заголовке темы.
Как то вот так:
if ((a=true) and (b=true) and (c=true)) then
showmessage('!');


а типы и значения переменных наши или ваши?
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39950882
Sergi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подправил условия задачи выше.
Только переменные
var a,b,c: boolean;
описаны, как глобальные, а не внутри процедуры. Это естественно.
при c:=true; - точку с запятой пропустил здесь в примере, в программе все правильно стоит.
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39950887
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergi
Подправил условия задачи выше.


подправьте еще раз:

- объявите типы переменных
- присвойте переменным начальные значения
- приведите полученный результат
- приведите правильный, с вашей точки зрения, результат
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39950890
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39950891
Sergi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Начальные значения естественно - false, даже если этого не объявлять.
Может Делфи-6 глючит у меня?
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39950894
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBr,

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

Если начальное значение FALSE, то почему он, по вашему, должен заходить в секцию ELSE ?
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39950900
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergi
Начальные значения естественно - false, даже если этого не объявлять.


все-таки, сделайте, как я прошу, не заставляйте меня загружать Delphi.

Если вам нужно получить ответ на вопрос,
то дайте нам все необходимые условия для ответа.
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39950901
Sergi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я сам сильно удивляюсь, что у меня не такой результат, как приведён выше. Мне пришлось разбить условие на два, тогда всё пошло хорошо.
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39950903
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
var a,b,c: boolean;
begin
if ((a=false) or (b=false) or (c=false)) then begin 
   a:=true; b:=true; c:=true 
end else
// сюда заходим только тогда, когда первый IF не выплнился
if ((a=true) and (b=true) and (c=true)) then
  showmessage('!!');
end;
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39950904
Sergi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DimaBr
Sergi
Начальные значения естественно - false,

Если начальное значение FALSE, то почему он, по вашему, должен заходить в секцию ELSE ?

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

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

Если начальное значение FALSE, то почему он, по вашему, должен заходить в секцию ELSE ?

Вторым проходом процедуры, должен заходить. У меня в программе опрос этой процедуры идёт циклически. В какой-то момент одна из переменных приобретает состояние false. Первым проходом всё должно выставляться в true. Вторым проходом - выполняться условие типа showmessage.


так вы снимаете свой вопрос, или все же приведете ПОЛНЫЙ неработающий пример?
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39950909
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergi
Может Делфи-6 глючит у меня?
Наверняка. У меня оно уже около 20 лет глючит.
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39950910
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39950911
Sergi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот истинный код:
if ((IPCPort=False) or (IPAdr=False) or (Pusk=False)) then
begin
Preryvanie:=True;
ToolButton5Click(Nil);
StatusBar1.Panels[0].Text:='Прервана связь или отключен контроллер!';
end else
if ({(Preryvanie=True) and} (IPCPort=True) and (IPAdr=True)) then
begin
if (Preryvanie=True) then
begin
ToolButton3Click(Nil);
Preryvanie:=False;
end else
if (Timer1.Enabled=False) then
Timer1.Enabled:=True;
end;

Мне пришлось закомментировать условие с Preryvanie и прописать его ниже, тогда всё пошло.
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39950913
Sergi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я понимаю, то что у меня произошло - смахивает на нонсенс. И такого странного результата в своих программах я не получал никогда. Всё, что разумно, работало всегда. А тут странность выскочила.
Прошу прощения за то, что оторвал вас от дел.
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39950914
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
удалено
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39950920
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В чём странность ? В том что вы не понимаете как работает ваш код ? Да, это действительно странно
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39950926
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавьте в начало и наблюдайте, какие значение имеют ваши флаги
Код: pascal
1.
2.
Caption := BoolToStr(IPCPort)+' '+BoolToStr(IPAdr) + ' '+BoolToStr(Pusk);
if ((IPCPort=False) or (IPAdr=False) or (Pusk=False)) then begin
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951049
Ничё вы демагогию развели тут



Код: pascal
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.
program Project1;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils;

var
  a, b, c: Boolean;
  strCheck: string;

begin
  Randomize;
  a := Boolean(Random(2));
  c := a;
  b := c;

  repeat
    Randomize;

    if a and b and c then
      strCheck := 'истины'
    else
      strCheck := 'не истины';

    Writeln(format('Все условия A=%s, B=%s, C=%s %s', [BoolToStr(a, true), BoolToStr(b, true), BoolToStr(c, true), strCheck]));

    a := Boolean(Random(2));
    b := Boolean(Random(2));
    c := Boolean(Random(2));

   Writeln(format('Все условия A=%s, B=%s, C=%s', [BoolToStr(a, true), BoolToStr(b, true), BoolToStr(c, true)]));

    if a and not b and c then
      strCheck := 'правы все, кроме b'
    else if b then
      strCheck := 'прав только b'
    else
      strCheck := 'Никто не прав';

    Writeln(strCheck);

    Readln;
  until false;

end.




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

тем не менее, в ваш код вкралась ошибка.

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


Сравнению глобальной булевой переменной с True соответствует следующий код:
Код: pascal
1.
2.
3.
  if b = True then
  cmp byte ptr [$005ef760],$01
  jnz $005db674

Байт в памяти, занимаемый переменной, сравнивается с $01, инструкция условного перехода jnz.
А что, если там ненулевое (мусорное) значение, не равное $01? Условие не выполнится.

А вот какой код соответствует проверке (не сравнения) булевой переменной на True:
Код: pascal
1.
2.
3.
  if b then
  cmp byte ptr [$005ef760],$00
  jz $005db66a

В данном случае сравнение идет с $00, инструкция условного перехода jz.
Если в переменной ненулевое значение, не равное $01, то условие выполнится.

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

А продвинутые языки давно на (isTrue) и (isTrue == true) используют единственную инструкцию test с je
И всё что (!isTrue) и (isTrue == false) используется test и jne

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

Это я про gcc и clang, в прочем delphi никогда не добиться и 10% от того, что могут те компиляторы. Я уже не говорю про оптимизацию кода.
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951223
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Polesov
Сравнению глобальной булевой переменной с True соответствует следующий код:
Код: pascal
1.
2.
3.
  if b = True then
  cmp byte ptr [$005ef760],$01
  jnz $005db674


Байт в памяти, занимаемый переменной, сравнивается с $01, инструкция условного перехода jnz.
А что, если там ненулевое (мусорное) значение, не равное $01? Условие не выполнится.


А сишников с первого класса учат, что сравнивать с true нельзя, и даже объясняют, почему. :)
...
Пожалуй, что булевский тип - зло. Никакой пользы от него, кроме вреда. И тем, кто сравнивает с true/false, и тем, кто на это смотрит...
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951267
Sergi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, всё дело оказалось в булевских переменных. Заменил и всё пошло. Очень хорошо пояснили суть проблемы. Не будем впредь надеяться на описание переменных булевского типа.
Спасибо всем за объяснение проблемы. Вопрос решён.
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951269
Sergi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
При чём сбой шёл только в случае условия - true и никогда с условием - false
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951272
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergi
Заменил и всё пошло

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

Можно узнать, что именно ты сделал?


Работает и когда убрал сравнения с true и false в условиях, ну и естественно, когда ушел от булевских переменных к integer, проверяю на = (0 или 1).
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951282
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
продолжение следует
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951291
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergi
ъъъъъ
пропущено...

Можно узнать, что именно ты сделал?


Работает и когда убрал сравнения с true и false в условиях, ну и естественно, когда ушел от булевских переменных к integer, проверяю на = (0 или 1).

То есть, теперь ждем сравнения неинициализированного целого с единицей.
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951304
GrigoriyFomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergi,
а почему не сравнивать с равно/не равно 0?
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951318
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
почему бы не начать искать ошибку у себя, а не у компилятора ))
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951324
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov
продолжение следует


Погоди, ТС еще до extended не добрался - вот тогда уже начнется....
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951331
Gluck99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov
почему бы не начать искать ошибку у себя, а не у компилятора ))
Интересно почему ТС не пользуется дебагером, чтобы инспектировать свои переменные прямо в процессе. Глядишь, чего и выяснится. Подскажите ему кто-нибудь, что так можно было.
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951382
Сошлите его в деморган, учить ООП. Если используются классы, глобальные переменные нельзя использовать. И ошибок не будет таких.
...
Рейтинг: 0 / 0
Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
    #39951417
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
Сошлите его в деморган, учить ООП. Если используются классы, глобальные переменные нельзя использовать. И ошибок не будет таких.


Классы + глобали под запретом уже? Это с какого перепугу-то?
...
Рейтинг: 0 / 0
Почему конструкция - 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
67 сообщений из 67, показаны все 3 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Почему конструкция - if ((a=true) and (b=true) and (c=true)) с тремя and не работает?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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