Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.99/140: Рейтинг темы: голосов - 140, средняя оценка - 4.99
-30 / 8 / 1
Регистрация: 31.05.2013
Сообщений: 485
1

Как понимать условие if (!a)?

18.07.2015, 10:24. Показов 25572. Ответов 23
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
int a = 0; if (!a)
т.е. если не ноль? Что не ноль?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.07.2015, 10:24
Ответы с готовыми решениями:

Как понимать условие цыкла while(1) ?
while(1) он выполняется один раз или он вечный ? Просто обычно в круглых скобках указывают...

Как это понимать?
Файл ExN02DetectorMessenger.hh #ifndef ExN02DetectorMessenger_h #define...

Как понимать такую запись?
typedef int (rifii&) (int, int); Прежде встречал использование typedef для создания псевдонимов...

Как это понимать вообще?
Добрый день. 4 месяца учу С++. Сейчас прошел онлайн тест на основы С++. И моя самооценка упала под...

23
67 / 67 / 72
Регистрация: 10.04.2015
Сообщений: 281
18.07.2015, 10:45 2
"не 0" это 1, http://ideone.com/HrBArQ
Если int a = 1; то !a = 0;

Такие дела.

Не по теме:

-125 =-O

0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
18.07.2015, 10:46 3
Цитата Сообщение от Albaz Посмотреть сообщение
если не ноль?
если 0
Цитата Сообщение от Albaz Посмотреть сообщение
Что не ноль?
a
0
Модератор
Эксперт CЭксперт С++
5284 / 2371 / 342
Регистрация: 20.02.2013
Сообщений: 5,770
Записей в блоге: 20
18.07.2015, 12:48 4
Лучший ответ Сообщение было отмечено castaway как решение

Решение

То, что находится внутри скобок оператора if приводится к булевому типу.

Для наглядности рассмотрим два варианта:

Прямой вариант:
C++
1
2
3
4
if (a) // если значение переменной a после приведения к булевому типу равно true
{//выполнить этот блок:
    //do something
}
Инвертированный вариант:
C++
1
2
3
4
if (!a) // если значение переменной a после приведения к булевому типу равно false
{//выполнить этот блок:
    //do something
}
Подытожим.
Если значение переменной a равно нулю, то:
1) в прямом варианте блок if не выполнится
2) в инвертированном, напротив, выполнится

Если значение переменной a отлично от нуля, то:
1) в прямом варианте блок if выполнится
2) в инвертированном, напротив, не выполнится

Добавлено через 23 минуты
Для пущей наглядности:
C++
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
#include <iostream>
 
int main()
{
    int a;
 
    std::cout << "Please enter an integer: ";
    std::cin >> a;
 
    if (a)
        std::cout << "1. The variable a is TRUE. Statement if succefully work.\n";
    else
        std::cout << "2. Let me guess... You have entered zero, huh?\n";
 
    std::cout << "Please enter an integer one more time: ";
    std::cin >> a;
 
    if (!a)
        std::cout << "3. The variable a is FALSE. But statement if succefully work.\n"
                     " Why not? Zero is good number too.\n";
    else
        std::cout << "4. Don't you like zero, do you?";
 
    return 0;
}
3
-30 / 8 / 1
Регистрация: 31.05.2013
Сообщений: 485
18.07.2015, 13:16  [ТС] 5
Почему :
C++
1
2
3
int f(int& x) {
  static int a = 0; if (!a) a = ++x; return a;}
  int y = 6; f(y); cout << f(y) << y;
функция печатает 7 и 7?
Статик а = 0. Если не-а, т.е. 1 то а = 6+1 => а = 7.
Ок!
Но с cout функция уже не сработает, т.к. не-7 это 0.
Печатаем у, равный у нас 6.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
18.07.2015, 21:45 6
Цитата Сообщение от Albaz Посмотреть сообщение
Почему функция печатает 7 и 7?
У тебя вроде вопрос изначально по-другому звучал.
С каким значением вызывается функция?
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
18.07.2015, 22:00 7
Цитата Сообщение от castaway Посмотреть сообщение
С каким значением вызывается функция?
да с любым, тут же
C++
1
cout << f(y) << y;
UB
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
18.07.2015, 22:06 8
Croessmah, по-моему там нет UB, но вот пример я прочитал невнимательно, видимо из-за отвратительного синтаксиса...
1
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
18.07.2015, 22:08 9
castaway, функция f принимает ссылку и внутри меняет значение параметра (++x).
А что будет вычислено раньше?
C++
1
cout << f(y) << y;
f(y) или y? Хотя может я что-то и путаю...
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
18.07.2015, 22:11 10
Цитата Сообщение от Albaz Посмотреть сообщение
Почему
Потому.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
int f( int & x ) {
    static int a = 0;
    if ( !a ) a = ++x;
    return a;
}
 
int main()
{
    int y = 6;
 
    // y == 6
 
    f( y );
 
    // y == 7
    // a == 7
 
    std::cout << f( y ) << y;
}
При повторном вызове функции, переменная a внутри неё не изменится.
1
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
18.07.2015, 22:14 11
Цитата Сообщение от castaway Посмотреть сообщение
При повторном вызове функции, переменная a внутри неё не изменится.
блин, там еще один вызов
Цитата Сообщение от castaway Посмотреть сообщение
но вот пример я прочитал невнимательно, видимо из-за отвратительного синтаксиса...
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
18.07.2015, 22:14 12
Цитата Сообщение от Croessmah Посмотреть сообщение
Хотя может я что-то и путаю...
У меня последнее время голова плохо работает по отношению к С++, но по-моему тут перегруженный оператор << "разрывает" точки следования.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
18.07.2015, 22:23 13
Цитата Сообщение от castaway Посмотреть сообщение
но по-моему тут перегруженный оператор << "разрывает" точки следования.
Убери первый вызов, чтобы x поменялся:
clang - http://rextester.com/LND13333 - 77
gcc - http://rextester.com/GSPKRY24977 - 76
1
sourcerer
18.07.2015, 22:25
  #14

Не по теме:

Цитата Сообщение от castaway Посмотреть сообщение
У меня последнее время голова плохо работает по отношению к С++
Чем занялся, если не секрет?

0
castaway
18.07.2015, 22:40
  #15

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
Убери первый вызов, чтобы x поменялся:
Всё верно. Туплю.. Бывает.. Вроде бы проблема стара как мир, но и GCC (с -Wall и -pedantic), и ICL даже предупреждений не выдают. А я просто забыл об этих "мелочах".

Цитата Сообщение от gru74ik Посмотреть сообщение
Чем занялся, если не секрет?
В том то и дело, что ни чем. Почти два месяца работы нет. Без физических нагрузок мозг начинает думать иначе. + отвлекаюсь на другие направления - Box2D, Chipmunk2D, OpenGL. Голова у меня, к сожалению, не резиновая)

0
-30 / 8 / 1
Регистрация: 31.05.2013
Сообщений: 485
19.07.2015, 05:42  [ТС] 16
" При повторном вызове функции, переменная a
внутри неё не изменится."
ах да....
if ( !a ) a = ++ x ;
return a ;
это же :
if ( !a ) a = ++ x ;
else return a ;
а я что то видел это как
if ( !a ) { a = ++ x ; return a ;}
т.е. ретен не всегда, а лишь при верном условии....

Добавлено через 11 минут
вернее
if ( !a ) {a = ++ x ;}
else {}
return a ;

Добавлено через 6 минут
и что, int & x стало = int y?
мы ж не делали присвоения ссылки переменной!
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
19.07.2015, 06:38 17
Цитата Сообщение от Albaz Посмотреть сообщение
и что, int & x стало = int y?
мы ж не делали присвоения ссылки переменной!
Уже говорил, повторю еще раз: почитай книги. Часть вопросов отпадет, и есть надежда, что оставшиеся будешь формулировать понятнее.
C++
1
2
3
4
5
6
7
8
// Функция прпнимает параметр по ссылке.
// Значение параметра может быть изменено посредством этой ссылки.
void f(int& x) {}
 
// 'y' передается в функцию, принимающую параметр по ссылке.
// Значение 'y' может быть изменено в функции.
int y;
f(y);
0
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
19.07.2015, 08:44 18
Отвечу без длинных текстов: это значит, что а должно быть ложью для выполнения if
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
19.07.2015, 08:59 19
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
что а должно быть ложью для выполнения if
Нет. Всё выражение !a должно быть true. А остальное зависит от типа a, перегрузок и т.д.
0
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
19.07.2015, 09:07 20
Croessmah,
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
а должно быть ложью
Цитата Сообщение от Croessmah Посмотреть сообщение
!a должно быть true
Это по сути одно и то же
0
19.07.2015, 09:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.07.2015, 09:07
Помогаю со студенческими работами здесь

Область видимости, как ее понимать
Здравствуйте. Поясните, пожалуйста, что значит тип size_type после области видимости, к чему он...

Как вообще понимать это задание?
Написать программу на языке программирования С++, которая воспринимает время как три целых...

Как понимать, что в правой части * в скобках?
Доброй ночи) вопросик, как понимать что в правой части * в скобках? char* a = (char*)b

Объясните, на что ругается компилятор, и как это понимать?
Здравствуйте уважаемые форумчане. Изучаю материал &quot;Принципы и практика использования C++&quot;...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru