Форум программистов, компьютерный форум CyberForum.ru

Что делает оператор ! в выражении инструкции? - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.62
koder
3 / 3 / 0
Регистрация: 13.06.2012
Сообщений: 28
28.07.2012, 23:28     Что делает оператор ! в выражении инструкции? #1
Меня что то запутали, к примеру :

C++
1
2
 int n=3, n2=0;
 if(!n != n2) cout << "\n";
Перенос строки выведется если выражение будет истинным, то есть оператор ! изменит значение своего операнда с 3 на 0 и получится, что 0 не равно 0, а это ложь и по этому перенос строки не выведется.
Но мне говорят, что этот оператор не изменяет значения операнда, а заставляет вывести тело инструкции даже если проверка дала ложь и наоборот если истину, то не вывести. Проблема в том, что я не могу придумать как это проверить, а информации по этому поводу тоже не нашел. Вот к примеру ещё этот код :

C++
1
2
 int n=3, n2=0;
 cout << !n << !n2;
Выведется 0 и 1, то есть здесь меняется значение переменной n c 3 на 0 и переменной n2 с 0 на 1 ? Или под "!n" имеется ввиду логическое выражение, которое проверяется и если оно не ноль, то значить это истина, но из за оператора ! оно станет ложным и выведется 0.
Какой вариант правильный и почему?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
28.07.2012, 23:38     Что делает оператор ! в выражении инструкции? #2
самый простой способ проверить - запустить и посмотреть как сработает. а потом чесать репу и думать, почему так, а не иначе. хотя код - идиотский.
HomeR_J_SimpsoN
59 / 59 / 2
Регистрация: 15.10.2010
Сообщений: 356
28.07.2012, 23:39     Что делает оператор ! в выражении инструкции? #3
Оператор "!" - логическое отрицание.
!true = false; !false = true;
тк в сях true - это любое число != 0, а false - просто ноль, то
!3 == 0; !7 == 0;
По умолчанию - true == 1;
посему
!0 == 1;
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
28.07.2012, 23:40     Что делает оператор ! в выражении инструкции? #4
Цитата Сообщение от HomeR_J_SimpsoN Посмотреть сообщение
По умолчанию - true == 1;
нет, true - это все, что не 0.
HomeR_J_SimpsoN
59 / 59 / 2
Регистрация: 15.10.2010
Сообщений: 356
28.07.2012, 23:43     Что делает оператор ! в выражении инструкции? #5
Цитата Сообщение от koder Посмотреть сообщение
Выведется 0 и 1, то есть здесь меняется значение переменной n c 3 на 0 и переменной n2 с 0 на 1 ? Или под "!n" имеется ввиду логическое выражение, которое проверяется и если оно не ноль, то значить это истина, но из за оператора ! оно станет ложным и выведется 0.
Здесь именно вычисляется выражение !n, при этом происходит преобразование типа int в тип bool (условия - выше), производится логическое отрицание и обратное преобразование. Результат - число.
NightmareZ
 Аватар для NightmareZ
1336 / 559 / 37
Регистрация: 31.03.2009
Сообщений: 1,907
28.07.2012, 23:44     Что делает оператор ! в выражении инструкции? #6
Цитата Сообщение от novi4ok Посмотреть сообщение
нет, true - это все, что не 0.
Он всё правильно сказал. Имелось ввиду, что (int)true == 1.
HomeR_J_SimpsoN
59 / 59 / 2
Регистрация: 15.10.2010
Сообщений: 356
28.07.2012, 23:44     Что делает оператор ! в выражении инструкции? #7
Цитата Сообщение от novi4ok Посмотреть сообщение
нет, true - это все, что не 0.
Читайте внимательнее.
true - это константа - одно число. Однако за true так же принимается любое ненулевое число.
Соотвественно
C++
1
(bool)7 == 1; (bool)10 == 1;
Но
C++
1
2
(int)true == 1; // Однозначное соответствие.
(int)false == 0;
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
28.07.2012, 23:50     Что делает оператор ! в выражении инструкции? #8
я - не любитель играть в побочные эффекты.

int n=3, n2=0;
if(!n != n2) cout << "\n";

какие типы будут сравниваться? bool <-> int ? int <-> int ? наверняка каждый компилятор делает как хочет. или где-то в недрах стандарта это определено, но ставлю на то, что нельзя определить каждый пук.

мне о таких вещах думать - такой облом! все равно как выяснять, что будет лучше: если молотком ударить по ногтю указательного пальца, или большого? я - за то, чтобы вообще не стучать по ногтям, а куда надо (разве что именно по ногтям и надо).
HomeR_J_SimpsoN
59 / 59 / 2
Регистрация: 15.10.2010
Сообщений: 356
28.07.2012, 23:53     Что делает оператор ! в выражении инструкции? #9
Цитата Сообщение от novi4ok Посмотреть сообщение
мне о таких вещах думать - такой облом! все равно как выяснять, что будет лучше: если молотком ударить по ногтю указательного пальца, или большого? я - за то, чтобы вообще не стучать по ногтям, а куда надо (разве что именно по ногтям и надо).
Что за бред?! Зачем стучать по ногтям?!
Аналогично:
Зачем писать такой бред?!
Цитата Сообщение от novi4ok Посмотреть сообщение
int n=3, n2=0;
if(!n != n2) cout << "\n";
Объясняю:
Сначала - переменная n воспринимается как булева, берется ее отрицание, получаем false. Далее она преобразуется в int, получаем ноль. Ноль - не равен нулю - неверно.
NightmareZ
 Аватар для NightmareZ
1336 / 559 / 37
Регистрация: 31.03.2009
Сообщений: 1,907
28.07.2012, 23:55     Что делает оператор ! в выражении инструкции? #10
Цитата Сообщение от novi4ok Посмотреть сообщение
какие типы будут сравниваться? bool <-> int ? int <-> int ? наверняка каждый компилятор делает как хочет. или где-то в недрах стандарта это определено, но ставлю на то, что нельзя определить каждый пук.
Почитай о приоритетах операций. Об этом пишут в любой книге включая "C++ для чайников".

Цитата Сообщение от novi4ok Посмотреть сообщение
мне о таких вещах думать - такой облом!
Вот, например, работая дворником, вообще думать не нужно. Подумай об этом.
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
29.07.2012, 02:14     Что делает оператор ! в выражении инструкции? #11
Цитата Сообщение от novi4ok Посмотреть сообщение
какие типы будут сравниваться? bool <-> int ? int <-> int ? наверняка каждый компилятор делает как хочет.
нет. При сравнении меньший тип преобразуется в больший.
C
1
2
3
4
5
6
7
8
int main() {
    unsigned    x = 0xffffffff;
    int         y = 0xffffffff;
 
    printf("%u", ( x > y ) );
 
    return 0;
}
koder, если ты школьник то все доступно объяснили уже, если студент, то курить бабмбук вместо пар по дискретной математике.
koder
3 / 3 / 0
Регистрация: 13.06.2012
Сообщений: 28
29.07.2012, 02:32  [ТС]     Что делает оператор ! в выражении инструкции? #12
Цитата Сообщение от alkagolik Посмотреть сообщение
нет. При сравнении меньший тип преобразуется в больший.
C
1
2
3
4
5
6
7
8
int main() {
    unsigned    x = 0xffffffff;
    int         y = 0xffffffff;
 
    printf("%u", ( x > y ) );
 
    return 0;
}
koder, если ты школьник то все доступно объяснили уже, если студент, то курить бабмбук вместо пар по дискретной математике.
Уже понял, ну я студент, а причем здесь дискретная математика? Просто я вышку в основном пропускал, потом собираюсь нагонять для себя.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
29.07.2012, 02:41     Что делает оператор ! в выражении инструкции? #13
Цитата Сообщение от novi4ok Посмотреть сообщение
какие типы будут сравниваться? bool <-> int ? int <-> int ? наверняка каждый компилятор делает как хочет. или где-то в недрах стандарта это определено, но ставлю на то, что нельзя определить каждый пук.
наврятли каждый компилятор делает это по-разному, но все же

Цитата Сообщение от novi4ok Посмотреть сообщение
if(!n != n2) cout << "\n";
если n все же 0, то смысл сравнения !n != n2 достаточно неведом (так как !n будет некое ненулевое значение)
например его значение может совпасть с n2
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
29.07.2012, 03:08     Что делает оператор ! в выражении инструкции? #14
Цитата Сообщение от alkagolik Посмотреть сообщение
то не надо курить бабмбук вместо пар по дискретной математике.
тут пропущено, как - то не заметил.

Не по теме:

Цитата Сообщение от koder Посмотреть сообщение
а причем здесь дискретная математика?
ну видимо не только вышку гулял.

alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
29.07.2012, 03:11     Что делает оператор ! в выражении инструкции? #15
Цитата Сообщение от alkagolik Посмотреть сообщение
ну видимо не только вышку гулял.
it's not rocket science
для таких вещей дискретка вовсе не нужна
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
29.07.2012, 03:17     Что делает оператор ! в выражении инструкции? #16
alex_x_x, не знаю. у нас булева алгебра и введение в матлогику были в курсе дискретки на первом курсе 2 семестра как самый основной фундамент, а дальше уже отдельными курсами более глубоко. Я полагал что это везде так.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.07.2012, 04:23     Что делает оператор ! в выражении инструкции? #17
Цитата Сообщение от alex_x_x Посмотреть сообщение
... (так как !n будет некое ненулевое значение)...
Разве не 1?
C++
1
2
3
4
int n = 0, n2 = 0;
    cout << !n << endl;
    cout << !n2 << endl;
    cout << (!n != n2) << endl;
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16827 / 5248 / 321
Регистрация: 30.03.2009
Сообщений: 14,132
Записей в блоге: 26
29.07.2012, 07:31     Что делает оператор ! в выражении инструкции? #18
Запись "!n" эквивалентна записи "func(n)", где func определено как:

C
int func (<type> n)
{
  if (n == 0)
    return 1;
  else
    return 0;
}
<type> - тип выражения, к которому применяется операция "!" (целый или плавающий тип)
Vogusar
5 / 5 / 0
Регистрация: 10.01.2012
Сообщений: 19
29.07.2012, 09:05     Что делает оператор ! в выражении инструкции? #19
C++
1
2
int n=3, n2=0;
if( !(n!= n2) ) cout << "\n";
Просто немного криво написано
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.07.2012, 13:28     Что делает оператор ! в выражении инструкции?
Еще ссылки по теме:

C++ Как возможно выйти в инструкции switch в начало самой инструкции при нажатии "не правильной" кнопки
C++ Не пойму что означает амперсанд в инструкции if
Что делает оператор init в данной ситуации (работа с двумерными массивами) C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
29.07.2012, 13:28     Что делает оператор ! в выражении инструкции? #20
да, действительно в стандарте нашел
The result of the logical negation operator!is 0 if the value of its operand compares
unequal to 0, 1 if the value of its operand compares equal to 0. The result has typeint.
The expression!Eis equivalent to(0==E).
не знал, что это гарантируется
Yandex
Объявления
29.07.2012, 13:28     Что делает оператор ! в выражении инструкции?
Ответ Создать тему
Опции темы

Текущее время: 22:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru