Можно ли вставить условие if внутри оператора return в C?

Моя цель — попытаться написать функцию как можно более лаконичной и короткой.

int func(void)
{
    int a;
    return (
        a = 42,
        a++,
        if (a > 42) a *= -1,
        a);
}

Я ожидал вернуть -43. Вместо этого у меня ошибка компиляции.

Как насчет просто return a; после всего?

dbush 11.02.2023 04:25

Лаконично и коротко было бы return -43;

user3386109 11.02.2023 04:27

Обратите внимание на оператора ?:. У вас не может быть if внутри оператора return.

Déjà vu 11.02.2023 04:40

То, что у вас есть внутри return( ... ), — это оператор запятой. Такие выражения, как a = 42 и a++, являются допустимыми выражениями, которые можно использовать с оператором запятой; но if (a>42) ... — это утверждение, и его нельзя использовать таким образом.

printf 11.02.2023 04:54

Какую ошибку вы получили?

Michael M. 12.02.2023 17:21
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
146
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы пробовали это?

int main(void)
{
    int a;

    return (a = 42, a++, a > 42 ? a = a * -1 : a);
}

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

tadman 11.02.2023 04:39

Подождите, почему ваш код выводит 213?

Viodid 11.02.2023 04:56

@viodid: main() должен возвращать целое число от 0 до 255, поэтому -43 не сработает. Но не случайно 213+43=256. Почитайте о дополнении 2.

rici 11.02.2023 16:21
Ответ принят как подходящий

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

int a;

return (
   a = 42,
   a++,
   if (a > 42) a *= -1,
   a);

Можно просто переписать как:

return -43;

Или, если это слишком коротко на ваш вкус, тогда вы ищете условный оператор (в просторечии называемый тернарным оператором), который имеет форму:

/* if a is logically true (does not evaluate to zero) 
*  then evaluate expression b, otherwise 
*  evaluate expression c
*/
a ? b : c;

Таким образом, утверждение return можно переписать так:

a = 42;
return ++a > 42 ? -a : a;

Что касается вашей цели, то в этом нет никакой заслуги. Вы не должны писать умный код. Это вредит читабельности и ремонтопригодности. (Хотя в данном случае это не так)

Помнить:

  1. Простота – это предельная изысканность. - Леонардо да Винчи
  2. Любой дурак может написать код что компьютер может понимать. Хороший программисты пишут код что люди могут понимать. ― Мартин Фаулер
  3. Все должно быть сделано как можно проще — но не проще. — Альберт Эйнштейн (приписывается).¹

[1] — кредит: @SteveSummit

Если вашей целью является написание функции, не пишите ее в основной функции. напишите его вне основного и вызовите функцию в основном Причина вашей ошибки заключается в том, что выражение вашего оператора содержит объяснение здесь https://stackoverflow.com/a/45653540/14308832 Итак, я думаю, вы хотите взять a в качестве параметра, иначе вы можете назначить a как 42 в func

int func(int a){
    a++;
    return (a > 42 ? a *= -1 : a);
}

int main(void)
{
    printf("%d",func(42));
}

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

Viodid 11.02.2023 05:11

Другие вопросы по теме