Самая изящная конструкция цикличного выполнения?

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

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

.handle((p, h) -> 
        new MethodInvokingMessageProcessor(h.get("myHandler"), h.get("myMethod", String.class)
                        .processMessage(new GenericMessage<>(p, h))))
8
задан 16 November 2008 в 23:44
поделиться

9 ответов

int n;
while (-1 != (n = get_data())) {
    send(n);
} // while
19
ответ дан 5 December 2019 в 04:29
поделиться
for (int n = get_data(); n != -1; n = get_data()) {
  send(n);
}
11
ответ дан 5 December 2019 в 04:29
поделиться

Howabout с помощью повреждения:

int n;
while(1) {
    n = get_data();
    if(n == -1)
        break;
    send(n);
}

Таким образом, Вы только тестируете однажды и сразу выходите, если get_data не возвращает то, что Вы хотите.

15
ответ дан 5 December 2019 в 04:29
поделиться

Подобный eed3si9n, но возможно легче читать:

 int n;
 while (n = get_data(), n != -1)
 {
     send(n);
 }
17
ответ дан 5 December 2019 в 04:29
поделиться
int n;
n = get_data();
while (n != -1) {
  send(n);
  n = get_data();
}
1
ответ дан 5 December 2019 в 04:29
поделиться

Ваша исходная версия прекрасна.

В моем последнем 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"не может стоить делать программу дольше.

4
ответ дан 5 December 2019 в 04:29
поделиться
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

-2
ответ дан 5 December 2019 в 04:29
поделиться

Создайте с a goto :)

int n;
goto inside; do {
  send(n);
inside:
  n=get_data();
} while(n!=-1);
0
ответ дан 5 December 2019 в 04:29
поделиться

В Python вы бы сделали это:

while True:
    n = get_data()
    if n == -1:
        break
    send(n)

Как видите, это ненамного короче вашей версии C. Обычно код Python в 5-10 раз меньше, чем его эквивалент на языке C. Здесь дело обстоит не так, поэтому вы можете наслаждаться своим читаемым, достаточно коротким и быстрым сниппетом и сосредоточиться на чем-то другом.

Если вы хотите сделать его короче, проверьте ответ Джонатана, но на самом деле это не имеет значения.

0
ответ дан 5 December 2019 в 04:29
поделиться