Присвоение C++ - стильный или производительность?

Будучи пишущим кодом Java много лет, я был поражен, когда я видел этот оператор C++:

int a,b;
int c = (a=1, b=a+2, b*3);

Мой вопрос: действительно ли это - выбор стиля кодирования, или он обладает реальным преимуществом? (Я ищу practicle вариант использования),

Я думаю, что компилятор будет рассматривать его то же как следующее:

int a=1, b=a+2;
int c = b*3;

(Каково официальное название этого? Я предполагаю, что это - стандартный синтаксис C/C++.)

11
задан Gregor Brandt 19 May 2010 в 21:13
поделиться

9 ответов

Это оператор запятой , используемый дважды. Вы правы насчет результата, и я не вижу особого смысла в его использовании.

17
ответ дан 3 December 2019 в 01:24
поделиться

Единственное «хорошее» использование оператора запятой может быть в операторе for , который имеет несколько переменных цикла, используется примерно так:

// Copy from source buffer to destination buffer until we see a zero
for (char *src = source, *dst = dest; *src != 0; ++src, ++dst) {
    *dst = *src;
}

Я напугал «хороший стиль» кавычки, потому что почти всегда есть лучший способ, чем использование оператора запятой.

Другой контекст, в котором я видел, что это используется, - это тернарный оператор, когда вы хотите иметь несколько побочных эффектов, например,

bool didStuff = DoWeNeedToDoStuff() ? (Foo(), Bar(), Baz(), true) : false;

Опять же, есть лучшие способы выразить такие вещи. Эти идиомы - пережитки тех дней, когда мы могли видеть только 24 строки текста на наших мониторах, и втискивание большого количества материала в каждую строку имело какое-то практическое значение.

6
ответ дан 3 December 2019 в 01:24
поделиться

Похоже на неясное использование оператора (запятая).

Это не репрезентативный способ делать что-то в C ++.

9
ответ дан 3 December 2019 в 01:24
поделиться

Не знаю, как это называется, но похоже, что оно отсутствует в Указаниях по кодированию безопасности вакансий !

Серьезно: C ++ позволяет делать много вещей во многих контекстах, даже если они не обязательно надежны. С большой силой приходит большая ответственность ...

3
ответ дан 3 December 2019 в 01:24
поделиться

Его строгий стиль кодирования, который не повлияет на вашу программу. Тем более, что любой достойный компилятор C ++ оптимизирует его до

int a=1; 
int b=3;
int c=9;

. Математика даже не будет выполняться во время присваивания во время выполнения. (а некоторые переменные могут быть даже полностью исключены).

Что касается выбора стиля кодирования, я предпочитаю второй пример. В большинстве случаев меньшее количество вложений лучше, и вам не понадобятся дополнительные скобки. Поскольку использование выставленных запятых известно практически всем программистам на C ++, у вас есть выбор стиля. В противном случае я бы посоветовал помещать каждое задание в отдельную строку.

1
ответ дан 3 December 2019 в 01:24
поделиться

В вашем примере кода используются две не очень хорошо известные новичкам (но и не совсем скрытые) особенности выражений C:

  • оператор запятой: обычный двоичный оператор, роль которого заключается в возвращении последнего из двух операндов. Если операнды являются выражением, они вычисляются слева направо.
  • Назначение в качестве оператора, возвращающего значение. Назначение C не является инструкцией, как в других языках, и возвращает назначенное значение.

Большинство вариантов использования обеих этих функций включают некоторую форму запутывания. Но есть и законные. Дело в том, что вы можете использовать их везде, где вы можете предоставить выражение: внутри условного if или некоторого времени, в блоке итерации цикла for, в параметрах вызова функции (при использовании coma вы должны использовать скобки, чтобы избежать путаницы с фактическими параметрами функции), в параметре макроса и т. Д.

Наиболее распространенное использование запятой, вероятно, в управлении циклом, если вы хотите изменить сразу две переменные,или сохранить некоторое значение перед выполнением теста цикла или итерации цикла.

Например, обратная функция может быть записана, как показано ниже, благодаря оператору запятой:

void reverse(int * d, int len){
    int i, j;

    for (i = 0, j = len - 1 ; i < j ; i++, j--){
       SWAP(d[i], d[j]);
    }
}

Другое законное (не запутанное, на самом деле) использование оператора coma, которое я имею в виду, - это макрос DEBUG, который я нашел в каком-то проекте, определяемом как:

#ifdef defined(DEBUGMODE)
#define DEBUG(x) printf x
#else
#define DEBUG(x) x
#endif

Вы используете его как:

DEBUG(("my debug message with some value=%d\n", d));

Если DEBUGMODE включен, то вы получите printf, если не функция оболочки не будет вызвана, но выражение между скобками по-прежнему является действительным C. Дело в том, что любой побочный эффект печати кода будет применяться как в релиз-коде, так и в отладочном коде, подобно тем, которые введены:

DEBUG(("my debug message with some value=%d\n", d++));

С приведенным выше макросом d всегда будет приращаться независимо от режима отладки или выпуска.

Вероятно, есть и другие редкие случаи, когда значения запятых и назначений полезны, и код легче писать, когда вы их используете.

Я согласен, что оператор присваивания является отличным источником ошибок, потому что его можно легко спутать с == в условном.

Я согласен с тем, что, поскольку запятая также используется с другим значением в других контекстах (вызовы функций, списки инициализации, списки объявлений), это был не очень хороший выбор для оператора. Но в принципе это не хуже, чем использование < и > для параметров шаблона в C++, и он существует в C с гораздо более старых времен.

2
ответ дан 3 December 2019 в 01:24
поделиться

Вы нашли отвратительное злоупотребление оператором запятой, написанное программистом, который, вероятно, жалеет, что в C++ нет множественного присваивания. Это не так. Мне вспоминается старая поговорка о том, что FORTRAN можно написать на любом языке. Очевидно, вы можете попытаться написать язык охраняемых команд Дейкстры на C++.

Чтобы ответить на ваш вопрос, это чисто вопрос (плохого) стиля, и компилятору все равно - компилятор сгенерирует точно такой же код, как и из того, что программист на C++ посчитает вменяемым и разумным.

Вы можете убедиться в этом сами, если сделаете два небольших примера функций и скомпилируете оба с опцией -S.

0
ответ дан 3 December 2019 в 01:24
поделиться

Это выбор стиля кодирования или он дает реальную пользу? (Я ищу практический пример использования)

Это и выбор стиля кодирования, и реальная выгода.

Это явно другой стиль кодирования по сравнению с вашим эквивалентным примером.

Преимущество в том, что я уже знаю, что никогда не захочу нанять человека, написавшего это, во всяком случае, в качестве программиста.

Пример использования: Боб приходит ко мне с фрагментом кода, содержащим эту строку. Я его перевел в маркетинг.

1
ответ дан 3 December 2019 в 01:24
поделиться

Это называется «запутанный C». Это законно, но призвано запутать читателя. И, похоже, это сработало. Если вы не пытаетесь быть скрытым, этого лучше избегать.

Хотей

2
ответ дан 3 December 2019 в 01:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: