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

Вниз

сравнение в С   Найти похожие ветки 

 
Рулон Обоев ©   (2005-02-28 16:22) [0]

попался тут кусок кода на С:

if (a == b ==! c)
   printf("Разносторонний треугольник!\n");

Работает правильно. В чем же хитрость оператора ==! ???


 
jack128 ©   (2005-02-28 17:37) [1]

ИМХО, это не один оператор, а два. Читать так
Рулон Обоев ©   (28.02.05 16:22)
if (a == b == (!c))
  printf("Разносторонний треугольник!\n");


 
Григорьев Антон ©   (2005-02-28 17:38) [2]

Нет такого оператора - "==!". Это оператор сравнения == и оператор ! (логическое not), поставленные рядом.


 
Рулон Обоев ©   (2005-02-28 17:50) [3]

Главный вопрос - как это работает?
(a, b и с - целочисленные значения)


 
}|{yk ©   (2005-02-28 17:52) [4]

Я че-то забыл? Если a,b,с - тип bool, то понятно. А если int, то что этот код значит?


 
jack128 ©   (2005-02-28 18:56) [5]

}|{yk ©   (28.02.05 17:52) [4]
тип bool, то понятно. А если int, то что этот код значит?

это же С.  Там же никакой типизации нет.

Как это может работать я не знаю. По идее должно быть так:
if a = b then
 temp1 := <любое не нулевое число, обычно 1>
else
 temp1 := 0;

if с = 0 then
 temp2 := <любое не нулевое число, обычно 1>
else
 temp2 := 0;

if temp1 = temp2 then
 printf("Разносторонний треугольник!\n");

так что условие дожно выполнятся только в том случае, если ((a = b) and (c = 0))  or ((a <> b) and (c <> 0))

PS тестил на borland C++ 3.1


 
Ломброзо ©   (2005-02-28 19:06) [6]

!с при положительном знаковом с типа инт всегда отрицательное число.


 
uw ©   (2005-02-28 19:23) [7]

В С !с == 0 - если с отлично от 0, и !с == 1 - если с равно 0.
В С++ !с == false - если с отлично от 0, и !с == true - если с равно 0.

a == b == !c есть ((a == b) == (!c)).

На Паскаль это переводится так:

((a = b) = (c = 0))


 
Ломброзо ©   (2005-02-28 19:30) [8]

Правда? Это я с ^ перепутал, что ли? Ойвэй...


 
uw ©   (2005-02-28 19:31) [9]

Перепутал.


 
Palladin ©   (2005-03-01 03:48) [10]

Позвольте спросить. А почему результат !c должен быть логическим? Почему не побитовой инверсией? "Не" имеет здесь наиболее высокий приоритет. Тогда выражение, в паскалевском эквиваленте, становится

(a=b)=(not c)


 
Palladin ©   (2005-03-01 03:50) [11]

Упс... не так...
(a=b) and (a=(not c))


 
uw ©   (2005-03-01 06:07) [12]

Palladin ©   (01.03.05 03:48) [10]
Позвольте спросить. А почему результат !c должен быть логическим? Почему не побитовой инверсией?


Это потому, что "!" называется "логическое НЕ". Но K&R решили вообще не вводить логического типа, и результат операции "!" всегда 0 или 1. При чем, что ни подсовывай - int, unsigned int, float, double - все равно получится 0 или 1.

Страуструп ввел тип bool, но операция "!" по-прежнему применима ко всем типам, только результат теперь либо false, либо true.

Вирт зашел еще дальше и придумал тип boolean, а "логичемкое НЕ" назвал "NOT". Но, в отличие от Страуструпа, разрешил ее применять только к логическим выражениям. Поэтому и твой первый пример, и упс-пример выглядят излишне оптимистично - протолкать через компилятор их никак не удастся.

На твои вопросы "А почему результат !c должен быть логическим? Почему не побитовой инверсией?" можно дать и более короткий ответ: потому что для побитовой инверсии K&R придумали операцию "~" - "побитовое НЕ".


 
TUser ©   (2005-03-01 06:37) [13]

uw прав, когда говорит про Си, но вот это не так

> Но, в отличие от Страуструпа, разрешил ее применять только
> к логическим выражениям

#include <stdio.h>

void main(void)
{
 int a = 1;
 int b = 2;
 int c = 123;

 if (!c)
 {printf("!c\n");}

 if (a == b == !c)
 {printf("true");}
 else
 {printf("false");}
}

var c: integer = 10;

begin
 writeln("!c = " + inttostr(not c));
end.


 
uw ©   (2005-03-01 06:51) [14]

TUser ©   (01.03.05 06:37) [13]

И то верно! Много раз применял NOT в таком контексте - в смысле инверсии, а тут заговорил про оптимизм. Занятно... Кстати, стало понятно, почему паскалисты ожидают аналогичного поведения и от сишного "!".


 
Григорьев Антон ©   (2005-03-01 12:15) [15]


> Palladin ©   (01.03.05 03:48) [10]
> Позвольте спросить. А почему результат !c должен быть логическим?
> Почему не побитовой инверсией?

Побитовая инверсия - это другой оператор - "~"


 
Palladin ©   (2005-03-02 02:35) [16]

понял...



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

Текущий архив: 2005.03.20;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.031 c
4-1107533427
_Вован
2005-02-04 19:10
2005.03.20
Работа с системным реестром


4-1107811582
Ipkis
2005-02-08 00:26
2005.03.20
как узнать когда же Юзер щелкнул по кнопке на ХТМЛ-страничке


1-1109769331
Gear
2005-03-02 16:15
2005.03.20
фон у ListBox


14-1109824602
begin...end
2005-03-03 07:36
2005.03.20
С Днём рождения! 3 марта


1-1109918516
leonidus
2005-03-04 09:41
2005.03.20
Access violation at addres - случаи возникновения