Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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
14-1109751261
Gero
2005-03-02 11:14
2005.03.20
Просьба потестировать


1-1110108926
WST
2005-03-06 14:35
2005.03.20
CheckListBox


1-1109946333
webpauk
2005-03-04 17:25
2005.03.20
Наследники


1-1110314094
Kotyara
2005-03-08 23:34
2005.03.20
PChar в качестве параметра-переменной


3-1108648358
Pluto
2005-02-17 16:52
2005.03.20
Размер базы данных





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский