Форум: "Потрепаться";
Текущий архив: 2005.03.20;
Скачать: [xml.tar.bz2];
Внизсравнение в С Найти похожие ветки
← →
Рулон Обоев © (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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.044 c