Нам нужно прежде всего понять, какова цель такой бизнес-логики.
Я думаю, что мы можем выполнить ваши требования с помощью этого кода:
.handle((p, h) ->
new MethodInvokingMessageProcessor(h.get("myHandler"), h.get("myMethod", String.class)
.processMessage(new GenericMessage<>(p, h))))
int n;
while (-1 != (n = get_data())) {
send(n);
} // while
for (int n = get_data(); n != -1; n = get_data()) {
send(n);
}
Howabout с помощью повреждения:
int n;
while(1) {
n = get_data();
if(n == -1)
break;
send(n);
}
Таким образом, Вы только тестируете однажды и сразу выходите, если get_data не возвращает то, что Вы хотите.
Подобный eed3si9n, но возможно легче читать:
int n;
while (n = get_data(), n != -1)
{
send(n);
}
int n;
n = get_data();
while (n != -1) {
send(n);
n = get_data();
}
Ваша исходная версия прекрасна.
В моем последнем C работает программирование, мы должны были следовать за MISRA кодирование стандартов.
По правилам MISRA, этому:
int n;
while(1) {
n = get_data();
if(n == -1)
break;
send(n);
}
запрещается из-за break
, и это:
while((n = get_data()) != -1) { send(n); }
запрещается, потому что присвоение появляется в булевом контексте, таким образом, я имею привычку писать циклы, подобные Вашей исходной версии.
Вы могли логическая переменная, если Вы думаете, что она сделает Ваше намерение более ясным или если тест является сложным выражением:
int n;
bool valid;
do {
n = get_data();
valid = n != -1;
if(valid)
send(n);
} while(valid);
Но для простого теста как"n != -1
"не может стоить делать программу дольше.
int get_data()
{
...
}
void _send(int )
{
...
}
int send(int (*a) ())
{
int n = a();
if (n == -1)
return n;
_send(n);
return 1;
}
int main()
{
int (*fp)();
fp = get_data;
while ( send(fp)!= -1 );
return 0;
}
HTH
Создайте с a goto
:)
int n;
goto inside; do {
send(n);
inside:
n=get_data();
} while(n!=-1);
В Python вы бы сделали это:
while True:
n = get_data()
if n == -1:
break
send(n)
Как видите, это ненамного короче вашей версии C. Обычно код Python в 5-10 раз меньше, чем его эквивалент на языке C. Здесь дело обстоит не так, поэтому вы можете наслаждаться своим читаемым, достаточно коротким и быстрым сниппетом и сосредоточиться на чем-то другом.
Если вы хотите сделать его короче, проверьте ответ Джонатана, но на самом деле это не имеет значения.