Моя цель — попытаться написать функцию как можно более лаконичной и короткой.
int func(void)
{
int a;
return (
a = 42,
a++,
if (a > 42) a *= -1,
a);
}
Я ожидал вернуть -43. Вместо этого у меня ошибка компиляции.
Лаконично и коротко было бы return -43;
Обратите внимание на оператора ?:
. У вас не может быть if
внутри оператора return.
То, что у вас есть внутри return( ... )
, — это оператор запятой. Такие выражения, как a = 42
и a++
, являются допустимыми выражениями, которые можно использовать с оператором запятой; но if (a>42) ...
— это утверждение, и его нельзя использовать таким образом.
Вы также можете взглянуть на выражения операторов , которые являются расширением gcc для стандартного C, но также поддерживается многими другими компиляторами.
Какую ошибку вы получили?
Вы пробовали это?
int main(void)
{
int a;
return (a = 42, a++, a > 42 ? a = a * -1 : a);
}
Вы можете сделать это, но если вам не нравится, когда ваши коллеги избегают вас за написание необслуживаемого кода, вам не следует этого делать.
Подождите, почему ваш код выводит 213?
@viodid: main() должен возвращать целое число от 0 до 255, поэтому -43 не сработает. Но не случайно 213+43=256. Почитайте о дополнении 2.
Моя цель состоит в том, чтобы написать функцию как можно более лаконичную и короткую. возможный.
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] — кредит: @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. В любом случае, спасибо!
Как насчет просто
return a;
после всего?