Каков синтаксис в c для объединения операторов в качестве параметра

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

Пример

char dstr[20];
printf("a dynamic string %s\n", (prep_dstr(dstr),dstr));

Идея состоит в том, что "()" вернет адрес dstr после выполнения функции prep_dstr.

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

#

Ок - в ответ на просьбу этого не делать.

На самом деле я выполняю очистку MISRA для некоторого существующего кода (не моего, не стреляйте в меня), в настоящее время функция «prep_dstr» принимает буфер, изменяет его (независимо от длины буфера) и возвращает указатель, который он передал как параметр.

Мне нравится делать маленький шаг — тестировать, а затем еще один маленький шаг.

Итак, чуть менее неприятный подход, чем возврат указателя без понятия о его сохранении, состоит в том, чтобы остановить функцию, возвращающую указатель, и использовать оператор запятой (после того, как он убедится, что он не отрывается от конца буфера).

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


person Chris Aaaaa    schedule 27.08.2014    source источник
comment
Почему бы просто не сделать это на линии раньше?   -  person user2357112 supports Monica    schedule 27.08.2014
comment
Но это должно сработать, не так ли? Когда , возвращает результат последнего выражения.   -  person martin    schedule 27.08.2014
comment
Я не понимаю, что вы спрашиваете. У вас правильный синтаксис (хотя я бы не советовал его использовать) в вопросе.   -  person interjay    schedule 27.08.2014
comment
MISRA-C запрещает оператор запятой. Разумный и совместимый с MISRA способ переписать код: prep_dstr(dstr); printf("a dynamic string %s\n", dstr);. Кроме того, MISRA запрещает использование stdio.h в производственном коде.   -  person Lundin    schedule 08.09.2014


Ответы (3)


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

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

char buffer[20];

char *destination = prepare_destination_string(buffer);

printf("a dynamic string %s\n", destination);

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

person Michael Foukarakis    schedule 27.08.2014

Оператор запятой имеет соответствующий приоритет и, кроме того, дает точку последовательности, то есть определяет точку в потоке выполнения программы, где разрешены все предыдущие побочные эффекты.
Итак, , что бы ни делала ваша функция prep_dstr() со строкой dstr, она полностью выполняется до того, как будет достигнут оператор запятой.

С другой стороны, оператор запятая дает выражение, значение которого является самым правым операндом.

Следующие примеры дают вам значение dstr, как вы хотите:

   5+3, prep_dstr(dstr), sqrt(25.0), dstr;
   a+b-c, NULL, dstr;
   (prep_dstr(dstr), dstr);

Конечно, такое выражение можно использовать везде, где нужна строка dstr.

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

Поскольку вы открыты для экспериментов с синтаксисом, есть еще одна возможность, которую вы можете использовать.
Принимая во внимание, что функция printf() является функцией, она, в частности, является выражением.
Таким образом, она можно поставить через запятую выражение:

  prep_dstr(dstr), printf("Show me the string: %s\n", dstr);

Кажется, все говорят вам, что "не пишите код так и так и так...".
Такого рода религиозные советы в стиле программирования переоценены.
Если вам нужно сделать что-нибудь, просто сделай это.

Один из принципов C гласит: «Не мешай программисту делать то, что уже сделано».

Однако, что бы вы ни делали, старайтесь писать читаемый код.

person pablo1977    schedule 27.08.2014

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

То, о чем вы думаете, это оператор запятой. В контексте, где запятая еще не имеет другого значения (например, для разделения аргументов функции), выражение a, b имеет значение b, но сначала вычисляет a. Дополнительные круглые скобки в вашем коде приводят к тому, что запятая интерпретируется таким образом, а не как разделитель аргументов функции.

person user2357112 supports Monica    schedule 27.08.2014