С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
GoldenId
131 / 130 / 64
Регистрация: 11.11.2010
Сообщений: 771
Записей в блоге: 14
Завершенные тесты: 1
1

Условный оператор

20.04.2017, 12:30. Просмотров 383. Ответов 10
Метки нет (Все метки)

Скажите, будет ли следующий код работать, как подразумевается - в зависимости от значения флага индексировать один или другой массив?
C++
1
2
3
    int aa[10], bb[10];
    bool f = ...;
    ( f ? aa : bb )[i] = ...;
Мне выдаёт предупреждения
Код
D:\Projects\cyberforum\tests\main.cpp|56|warning: second operand of conditional expression has no effect [-Wunused-value]|
D:\Projects\cyberforum\tests\main.cpp|56|warning: third operand of conditional expression has no effect [-Wunused-value]|
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.04.2017, 12:30
Ответы с готовыми решениями:

Условный оператор, оператор ввода/вывода; плоскость и принадлежность точки
Здравствуйте. В С++ я абсолютный новичок, поэтому с первым же заданием возникли...

Условный оператор
Здравствуйте! Есть такой вопрос: Собственно, что она выведет и почему -...

Условный оператор
1)Составить программу для вычисления значения функции f(x)...

Условный оператор.
Написала код программы выдаёт ошибки. :( Вычислить значение функции ...

C (условный оператор)
помогите решить задачи (кроме 3):

10
MrGluck
Модератор
Эксперт CЭксперт С++
8106 / 4958 / 1436
Регистрация: 29.11.2010
Сообщений: 13,454
20.04.2017, 12:44 2
GoldenId, будет.
Флаг -Wunused-value выдаёт предупреждения если переменная объявлена и не используется.
0
GoldenId
131 / 130 / 64
Регистрация: 11.11.2010
Сообщений: 771
Записей в блоге: 14
Завершенные тесты: 1
20.04.2017, 14:29  [ТС] 3
Код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class Fraction
{
    // ...
private:
    digit_type* int_;
    digit_type* frac;
    // ...
};
 
    //...
    Fraction q( intlen, fraclen );  // частное; примем, что по цифрам оно совпадаем с делимым
    // ...
    q.( ( u <= dh ) ? int_ : frac )[( ( u <= dh ) ? dh - u ??: u - dh??] += 1;  // (327) прибавляем единицу к соотв цифре частного

Build log
Код
||=== Build: Debug in Fraction (compiler: GNU GCC Compiler) ===|
D:\Projects\cyberforum\Fraction\frac.cpp||In member function 'Fraction Fraction::operator/(const Fraction&) const':|
D:\Projects\cyberforum\Fraction\frac.cpp|327|error: expected unqualified-id before '(' token|
D:\Projects\cyberforum\Fraction\frac.cpp|327|error: expected primary-expression before '?' token|
D:\Projects\cyberforum\Fraction\frac.cpp|327|error: expected primary-expression before '?' token|
D:\Projects\cyberforum\Fraction\frac.cpp|327|error: expected primary-expression before ']' token|
D:\Projects\cyberforum\Fraction\frac.cpp|327|error: expected ':' before ']' token|
D:\Projects\cyberforum\Fraction\frac.cpp|327|error: expected primary-expression before ']' token|
D:\Projects\cyberforum\Fraction\frac.cpp|327|error: expected ':' before ']' token|
D:\Projects\cyberforum\Fraction\frac.cpp|327|error: expected primary-expression before ']' token|
D:\Projects\cyberforum\Fraction\frac.cpp|327|error: expected ':' before ']' token|
D:\Projects\cyberforum\Fraction\frac.cpp|327|error: expected primary-expression before ']' token|
D:\Projects\cyberforum\Fraction\frac.cpp|327|error: expected ':' before ']' token|
D:\Projects\cyberforum\Fraction\frac.cpp|327|error: expected primary-expression before ']' token|
D:\Projects\cyberforum\Fraction\frac.cpp|327|error: expected ')' before ']' token|
D:\Projects\cyberforum\Fraction\frac.cpp|327|error: expected ']' before ';' token|
||=== Build failed: 14 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|



Добавлено через 16 минут
C++
1
    ( ( u <= dh ) ? q.int_ : frac )[( u <= dh ) ? dh - u : u - dh - 1] += 1;
0
MrGluck
Модератор
Эксперт CЭксперт С++
8106 / 4958 / 1436
Регистрация: 29.11.2010
Сообщений: 13,454
20.04.2017, 14:33 4
GoldenId, такой код очень неудобно читать. Если вы запишите промежуточные результаты в переменные, хуже от этого не станет (они всё равно заинлайнятся 99.99%)
1
dailydose
659 / 205 / 88
Регистрация: 21.07.2016
Сообщений: 1,034
Записей в блоге: 2
Завершенные тесты: 1
20.04.2017, 15:16 5
C++
1
2
3
int aa[10], bb[10];
    bool f = ...;
    ( f ? aa : bb )[i] = ...;
]

C++
1
2
3
4
5
6
7
8
int aa[10], bb[10];
    bool f = ...;
 
 
if (f)
    aa[i] = ...;
else
    bb[i] = ...;
\\

??
0
GoldenId
131 / 130 / 64
Регистрация: 11.11.2010
Сообщений: 771
Записей в блоге: 14
Завершенные тесты: 1
20.04.2017, 16:32  [ТС] 6
MrGluck разве так кратко писать, не есть одна из целей программирования? К тому же, когда пишешь операцию, отправляться в место выше и заводить переменную - разве не неудобство программиста?


dailydose, да это понятно.. откуда взялось-то..

Добавлено через 2 минуты
К тому же в той функции и так уже с полтора десятка локальных переменных (s, t, dh, ih1, fh2...)

Добавлено через 41 секунду
И сама функция под сотню строк..

Добавлено через 46 минут
Победил std::transform с std::reverse_iterator:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    // копирование целой части из буфера в экземпляр нашего класса с преобразованием типа
    // из char_t в digit_type;
    // т.к. целая часть хранится по убыванию индексов, то применяется обратный итератор
    //std::reverse_iterator<Fraction::digit_type*> ri( f.int_ + intlen - 1 );
    std::transform(
        buf.c_str(),
        buf.c_str() + intlen,
        std::reverse_iterator<Fraction::digit_type*>( f.int_ + intlen - 1 ),
        [] ( auto ch ) { return Fraction::to_digit( ch ); } );
 
    // копирование дробной части
    std::transform(
        buf.c_str() + intlen + 1,
        buf.c_str() + intlen + 1 + fraclen,
        f.frac,
        [] ( auto ch ) { return Fraction::to_digit( ch ); } );
0
MrGluck
Модератор
Эксперт CЭксперт С++
8106 / 4958 / 1436
Регистрация: 29.11.2010
Сообщений: 13,454
20.04.2017, 16:34 7
Цитата Сообщение от GoldenId Посмотреть сообщение
разве так кратко писать, не есть одна из целей программирования?
Цитата Сообщение от GoldenId Посмотреть сообщение
разве не неудобство программиста?
Код большую часть времени читается, а не пишется.
Он, конечно, должен выполнять поставленную задачу. Но не менее важно то, как он был написан.
В вашем коде должно быть легко разбираться, иначе можно будет наделать ошибок.
Я думаю, вам следует ознакомиться с "Совершенным кодом" Макконнелла.
1
GoldenId
131 / 130 / 64
Регистрация: 11.11.2010
Сообщений: 771
Записей в блоге: 14
Завершенные тесты: 1
21.04.2017, 11:56  [ТС] 8
MrGluck, благодарю.

Добавлено через 2 минуты
Кстати, может быть, это программирование в стиле другого языка? Например Ruby или Haskell?
C++
1
( ( u <= dh ) ? q.int_ : frac )[( u <= dh ) ? dh - u : u - dh - 1] += 1;
Ведь STL предполагает "гробы":
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    // копирование целой части из буфера в экземпляр нашего класса с преобразованием типа
    // из char_t в digit_type;
    // т.к. целая часть хранится по убыванию индексов, то применяется обратный итератор
    //std::reverse_iterator<Fraction::digit_type*> ri( f.int_ + intlen - 1 );
    std::transform(
        buf.c_str(),
        buf.c_str() + intlen,
        std::reverse_iterator<Fraction::digit_type*>( f.int_ + intlen /*- 1*/ ),
        [] ( auto ch ) { return Fraction::to_digit( ch ); } );
        // учитываем, что reverse_iterator при обращении прямого итератора указывает на один элемент перед ним, поэтому 1 не вычитаем
 
    // копирование дробной части
    std::transform(
        buf.c_str() + intlen + 1,
        buf.c_str() + intlen + 1 + fraclen,
        f.frac,
        [] ( auto ch ) { return Fraction::to_digit( ch ); } );
0
MrGluck
Модератор
Эксперт CЭксперт С++
8106 / 4958 / 1436
Регистрация: 29.11.2010
Сообщений: 13,454
21.04.2017, 12:18 9
Цитата Сообщение от GoldenId Посмотреть сообщение
Кстати, может быть, это программирование в стиле другого языка?
Это программирование без стиля.
Матан какой-то, так можно на любом языке написать.
0
GoldenId
131 / 130 / 64
Регистрация: 11.11.2010
Сообщений: 771
Записей в блоге: 14
Завершенные тесты: 1
21.04.2017, 12:45  [ТС] 10
Цитата Сообщение от MrGluck Посмотреть сообщение
Это программирование без стиля.
Матан какой-то, так можно на любом языке написать.
Как же быть тогда с цепочными вызовами и последним приведённым примером?
0
MrGluck
Модератор
Эксперт CЭксперт С++
8106 / 4958 / 1436
Регистрация: 29.11.2010
Сообщений: 13,454
21.04.2017, 12:50 11
Цитата Сообщение от GoldenId Посмотреть сообщение
Как же быть тогда с цепочными вызовами
Всегда можно сохранить промежуточный результат в переменную с осмысленным названием (можно даже использовать ссылку или указатель, если это необходимо).
Цитата Сообщение от GoldenId Посмотреть сообщение
последним приведённым примером?
Если честно, я так до конца и не понял, что вам требуется. Вы мало конкретной информации предоставили.
0
21.04.2017, 12:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.04.2017, 12:50

Условный оператор IF
Содержание: 1+d sin d/a (i-1)i+{a}^{2} ...

Условный оператор if else
Что не так? #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;iostream&gt; int...

условный оператор IF
Даны три вещественных числа. Возвести в квадрат те, которые положительные.


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru