Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Услованя операция / 14 сообщений из 14, страница 1 из 1
21.06.2007, 12:36
    #34610386
Услованя операция
Добрый день, возник вопрос, есть код:

-------------------------------------------------------
bool prisnak;

prisnak = true;

ShowMessage("При: " + (prisnak) ? "вет" : "дурок");

Этот код всегда показывает "вет".
------------------------------------------------------

Хотя если переделать:
------------------------------------------------------
bool prisnak;
AnsiString st;

prisnak = true;
st = (prisnak) ? "вет" : "дурок";

ShowMessage("При: " + st);

то все нормально.
-----------------------------------------------------
почему условная операция некорректно работает в той ситуации?
...
Рейтинг: 0 / 0
21.06.2007, 12:46
    #34610444
Dronord
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Услованя операция
Во-первых, лучше в скобки взять:
Код: plaintext
1.
2.
3.
4.
bool prisnak;

prisnak = true;

ShowMessage("При: " + ((prisnak) ? "вет" : "дурок") );

Во-вторых, код не показывает "При:" или никогда не показывает "При:дурок"?
...
Рейтинг: 0 / 0
21.06.2007, 12:46
    #34610445
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Услованя операция
Эх, Иван Иваныч! Приоритеты операторов посмотри и скобочки добавь
...
Рейтинг: 0 / 0
21.06.2007, 12:47
    #34610449
Карабас Барабас
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Услованя операция
DronordShowMessage("При: " + ((prisnak) ? "вет" : "дурок") );и что даст операция сложения двух указателей ?
если это вобще скомпилится
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
21.06.2007, 12:50
    #34610468
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Услованя операция
Карабас Барабаси что даст операция сложения двух указателей ?
если это вобще скомпилится Скомпилится нормально, Борланд умеет так делать для типа AnsiString, а именно его и ожидает функция ShowMessage(). Неявное приведение типов типа
...
Рейтинг: 0 / 0
21.06.2007, 12:54
    #34610490
Карабас Барабас
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Услованя операция
egorychСкомпилится нормальнонеявное приведение работает, когда операнды разного типа, а ты складываешь 2 указателя. Если ты приведешь один из них к AnsiSting, тогда второй приведется неявно. А то, что ожидает ShowMessage - совершенно пофиг
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
21.06.2007, 12:55
    #34610494
Услованя операция
Иван ИванычДобрый день, возник вопрос, есть код:

-------------------------------------------------------
bool prisnak;

prisnak = true;

ShowMessage("При: " + (prisnak) ? "вет" : "дурок");

Этот код всегда показывает "вет".
------------------------------------------------------

Хотя если переделать:
------------------------------------------------------
bool prisnak;
AnsiString st;

prisnak = true;
st = (prisnak) ? "вет" : "дурок";

ShowMessage("При: " + st);

то все нормально.
-----------------------------------------------------
почему условная операция некорректно работает в той ситуации?
Потому что надо правильно ставить скобки...
Формат условной операции:
Код: plaintext
1.
<проверяемое условие>?<оператор, выполняемый если условие истинно>:<оператор, выполняемый условие ложно>

Ваше первое выражение:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
-------------------------------------------------------
bool prisnak;

prisnak = true;

ShowMessage("При: " + (prisnak) ? "вет" : "дурок");

Этот код всегда показывает "вет".
------------------------------------------------------

проверяемое условие ( "При: " + (prisnak) ) не равно 0 (т.е. является true), поэтому "Этот код всегда показывает "вет".

Во втором фрагменте вы все делаете корректно.

Правильный первый фрагмент:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
-------------------------------------------------------
bool prisnak;

prisnak = true;

ShowMessage("При: " + ((prisnak) ? "вет" : "дурок") );

------------------------------------------------------
...
Рейтинг: 0 / 0
21.06.2007, 13:09
    #34610585
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Услованя операция
Карабас Барабаснеявное приведение работает, когда операнды разного типа, а ты складываешь 2 указателя. Если ты приведешь один из них к AnsiSting, тогда второй приведется неявно. А то, что ожидает ShowMessage - совершенно пофиг Практика показывает, что зря я спорю - действительно неплохо-бы хоть чего-нить привести к AnsiString.
...
Рейтинг: 0 / 0
21.06.2007, 13:13
    #34610608
Sandro_K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Услованя операция
Не могу понять, как это может вообще работать, тут складываются указатели, и только потом, при передачу в функцию, должно пройти преобразование в AnsiString. Или я чего-то недопонимаю?
...
Рейтинг: 0 / 0
21.06.2007, 13:18
    #34610629
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Услованя операция
тот код, который всегда возвращает "вет" действительно работает, не происходит складывания указателей, а вот исправленный - требует явного приведения хоть какого-нибудь куска, что, в общем-то логично
...
Рейтинг: 0 / 0
21.06.2007, 13:20
    #34610639
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Услованя операция
Sandro_KНе могу понять, как это может вообще работать, тут складываются указатели, и только потом, при передачу в функцию, должно пройти преобразование в AnsiString. Или я чего-то недопонимаю?

По всей видимости указатель инкрементируется на bool приведенный к int, получается не null и возвращается "вет"
...
Рейтинг: 0 / 0
21.06.2007, 13:22
    #34610645
Sandro_K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Услованя операция
Спасибо, уже все понял
...
Рейтинг: 0 / 0
21.06.2007, 13:58
    #34610838
Услованя операция
Понятно, тут такое обсуждение началось, жаль что на обед выходил, как-то не подумал, а если скобки, то нужно было к Ansi приводить, иначе invalid pointer. Спасибо.
...
Рейтинг: 0 / 0
25.06.2007, 08:51
    #34616375
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Услованя операция
> bool prisnak;
> AnsiString st;
>
> prisnak = true;
> st = (prisnak) ? "вет" : "дурок";
>
> ShowMessage("При: " + st);
> почему условная операция некорректно работает в той ситуации?

Потому что operator+ для AnsiString и для char* работают немного
по-разному. В первом случае код некорректный.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Услованя операция / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]