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

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

20.04.2017, 12:30. Просмотров 519. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.04.2017, 12:30
Ответы с готовыми решениями:

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

Условный оператор
Помогите решить задачу: Даны четыре целых числа a, b, c и d. Найти наименьшее из максимумов первой...

Условный оператор if else
Что не так? #include <stdio.h> #include <conio.h> #include <iostream> int main() { int...

Условный оператор if
Добрый день! есть следующий код программы на C++: #include<cmath> #include<iostream> int main(){...

10
Форумчанин
Эксперт CЭксперт С++
8159 / 5007 / 1436
Регистрация: 29.11.2010
Сообщений: 13,458
20.04.2017, 12:44 2
GoldenId, будет.
Флаг -Wunused-value выдаёт предупреждения если переменная объявлена и не используется.
0
131 / 130 / 64
Регистрация: 11.11.2010
Сообщений: 809
Записей в блоге: 14
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
Форумчанин
Эксперт CЭксперт С++
8159 / 5007 / 1436
Регистрация: 29.11.2010
Сообщений: 13,458
20.04.2017, 14:33 4
GoldenId, такой код очень неудобно читать. Если вы запишите промежуточные результаты в переменные, хуже от этого не станет (они всё равно заинлайнятся 99.99%)
1
666 / 212 / 88
Регистрация: 21.07.2016
Сообщений: 1,036
Записей в блоге: 2
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
131 / 130 / 64
Регистрация: 11.11.2010
Сообщений: 809
Записей в блоге: 14
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
Форумчанин
Эксперт CЭксперт С++
8159 / 5007 / 1436
Регистрация: 29.11.2010
Сообщений: 13,458
20.04.2017, 16:34 7
Цитата Сообщение от GoldenId Посмотреть сообщение
разве так кратко писать, не есть одна из целей программирования?
Цитата Сообщение от GoldenId Посмотреть сообщение
разве не неудобство программиста?
Код большую часть времени читается, а не пишется.
Он, конечно, должен выполнять поставленную задачу. Но не менее важно то, как он был написан.
В вашем коде должно быть легко разбираться, иначе можно будет наделать ошибок.
Я думаю, вам следует ознакомиться с "Совершенным кодом" Макконнелла.
1
131 / 130 / 64
Регистрация: 11.11.2010
Сообщений: 809
Записей в блоге: 14
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
Форумчанин
Эксперт CЭксперт С++
8159 / 5007 / 1436
Регистрация: 29.11.2010
Сообщений: 13,458
21.04.2017, 12:18 9
Цитата Сообщение от GoldenId Посмотреть сообщение
Кстати, может быть, это программирование в стиле другого языка?
Это программирование без стиля.
Матан какой-то, так можно на любом языке написать.
0
131 / 130 / 64
Регистрация: 11.11.2010
Сообщений: 809
Записей в блоге: 14
21.04.2017, 12:45  [ТС] 10
Цитата Сообщение от MrGluck Посмотреть сообщение
Это программирование без стиля.
Матан какой-то, так можно на любом языке написать.
Как же быть тогда с цепочными вызовами и последним приведённым примером?
0
Форумчанин
Эксперт CЭксперт С++
8159 / 5007 / 1436
Регистрация: 29.11.2010
Сообщений: 13,458
21.04.2017, 12:50 11
Цитата Сообщение от GoldenId Посмотреть сообщение
Как же быть тогда с цепочными вызовами
Всегда можно сохранить промежуточный результат в переменную с осмысленным названием (можно даже использовать ссылку или указатель, если это необходимо).
Цитата Сообщение от GoldenId Посмотреть сообщение
последним приведённым примером?
Если честно, я так до конца и не понял, что вам требуется. Вы мало конкретной информации предоставили.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.04.2017, 12:50

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Условный оператор
Добрый день,нужна помощь в написании кода по заданию. Составить систему неравенств на основании...

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

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

Условный оператор.
Даны три действительных числа. Выбрать из них те, которые принадлежат интервалу (1, 3).


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

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

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