Более короткий способ написания следующего кода на C ++ (if-else) - PullRequest
0 голосов
/ 05 мая 2019

Мне нужно знать, есть ли лучший / более короткий способ написания следующего кода на С ++. (при выполнении основного if-else (шаг за шагом) будет добавлена ​​дополнительная проверка для переменной 'y')

int x = 5, y = 4;        

if(x == 1){
  if(y == 1)
      printf("ok");
  else
      printf("not ok");
}
else if(x == 2){
  if((y == 1) || (y == 2))
      printf("ok");
  else
      printf("not ok");
}
else{
  if((y == 1) || (y == 2) || (y == 3))
      printf("ok");
  else
      printf("not ok");
}

Ответы [ 4 ]

6 голосов
/ 05 мая 2019
if(0<y && y<4 && (y<=x || x<1))
    printf("ok");
else
    printf("not ok");

@ Кристоф, вы правы, объяснение может быть полезным:

int x = 5, y = 4;        

if(x == 1){
  if(y == 1)
      printf("ok");
  else
      printf("not ok");
}
else if(x == 2){
  if((y == 1) || (y == 2))
      printf("ok");
  else
      printf("not ok");
}
else{
  if((y == 1) || (y == 2) || (y == 3))
      printf("ok");
  else
      printf("not ok");
}

Когда 'printf ("ok");'был выполнен, '(y == 1) ||(у == 2) ||(y == 3) 'должно быть' true '.

' x 'и' y 'означают целые числа:

' (y == 1) ||(у == 2) ||(y == 3) 'эквивалентно' 0

4 голосов
/ 05 мая 2019

Сначала вы можете проверить y:

if (y == 1 
|| (y == 2 && x != 1)
|| (y == 3 && x != 1 && x != 2))
    printf(“ok”);
else
    printf(“not ok”);

(Могут быть избыточные скобки, но это одна из ситуаций, когда я лично считаю, что избыточные скобки - это хорошо.)

2 голосов
/ 05 мая 2019

Я отвечаю на вопрос stricto sensu , если значения x и y неизвестны, это другой вопрос

Благодаря строке int x = 5, y = 4; известны значения x и y , а код можно уменьшить до

printf("not ok");

gcc знает, что, имея (я заменил «ок» на «нормально», чтобы не использовать «не хорошо» +4, чтобы получить «хорошо»):

#include <stdio.h>

int main()
{
  int x = 5, y = 4;

  if(x == 1){
    if(y == 1)
      printf("is ok");
    else
      printf("not ok");
  }
  else if(x == 2){
    if((y == 1) || (y == 2))
      printf("is ok");
    else
      printf("not ok");
  }
  else{
    if((y == 1) || (y == 2) || (y == 3))
      printf("is ok");
    else
      printf("not ok");
  }
  return 0;
}

Сборник для изготовления ассемблера:

pi@raspberrypi:/tmp $ gcc -S -O2 c.c
pi@raspberrypi:/tmp $ more c.s
    .arch armv6
    .eabi_attribute 28, 1
    .eabi_attribute 20, 1
    .eabi_attribute 21, 1
    .eabi_attribute 23, 3
    .eabi_attribute 24, 1
    .eabi_attribute 25, 1
    .eabi_attribute 26, 2
    .eabi_attribute 30, 2
    .eabi_attribute 34, 1
    .eabi_attribute 18, 4
    .file   "c.c"
    .section    .text.startup,"ax",%progbits
    .align  2
    .global main
    .syntax unified
    .arm
    .fpu vfp
    .type   main, %function
main:
    @ args = 0, pretend = 0, frame = 0
    @ frame_needed = 0, uses_anonymous_args = 0
    push    {r4, lr}
    ldr r0, .L3
    bl  printf
    mov r0, #0
    pop {r4, pc}
.L4:
    .align  2
.L3:
    .word   .LC0
    .size   main, .-main
    .section    .rodata.str1.4,"aMS",%progbits,1
    .align  2
.LC0:
    .ascii  "not ok\000"
    .ident  "GCC: (Raspbian 6.3.0-18+rpi1+deb9u1) 6.3.0 20170516"
    .section    .note.GNU-stack,"",%progbits
pi@raspberrypi:/tmp $ grep ok c.s
    .ascii  "not ok\000"

в main нет теста или эквивалента, а строка "в порядке" отсутствует в сгенерированном коде

1 голос
/ 05 мая 2019

не гламурно, но все же ..

if(x == 1 && y == 1) {
     printf("ok");
} else if(x == 2 && y == 1) {
     printf("ok");
} else if(x == 2 && y == 2) {
     printf("ok");
} else if(y == 1 || y == 2 || y == 3) {
     printf("ok");
} else {
     printf("not okay");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...