在不使用单个if的条件下做一些声明

时间:2016-11-26 17:29:35

标签: c++ c

我正在努力解决流动的问题:

您将获得一个名为n的整数 打印' +'如果n是正数,则 打印' - '如果n为负数,则 打印' 0'如果n为零。

编写c \ c ++解决方案而不使用单个if!

我写了这段代码:

int n;
scanf("%d", &n);

! n >> (sizeof(n) - 1) && printf("-") || return 0;
n > 0 && prtintf("+") || return 0;
printf("0");
retuen 0;

但是我收到了错误:在返回'之前预期的primary-expression;第3和第4行。 如何更改此代码以使其正常工作!

p.s:使用? :运营商被认为是作弊!

2 个答案:

答案 0 :(得分:0)

条件运算符?:是最简单和最合适的答案。

但如果你愿意,你可以做到

int n = -5;
...
const char s[] = { '-', '0', '+' };
std::cout << (s + 1)[(n > 0) - (n < 0)] << std::endl;

如果我正确破译了原始代码的意图,那么基于逻辑运算符的短路属性的解决方案可能如下所示

 (n < 0 && (std::cout << '-', true)) || 
   (n > 0 && (std::cout << '+', true)) || 
   (std::cout << '0', true);
 std::cout << std::endl;

不要尝试将return语句注入表达式。 return是一个声明,而不是运营商。您不能在表达式中使用return

答案 1 :(得分:0)

是的,它是可行的(有一些限制)。

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

// Assuming 2s-complement numbers
// and an understanding compiler
// Some checks omitted!

int main(int argc, char **argv)
{
  int input;
  unsigned int itmp;
  int size;
  int sign, sin, sout;
  char out[3] = { '0', '+', '-' };


  if (argc != 2) {
    fprintf(stderr, "Usage: %s integer\n", argv[0]);
    exit(EXIT_FAILURE);
  }
  // TODO: use strtol and check input!
  input = atoi(argv[1]);

  size = sizeof(int) * CHAR_BIT;
  itmp = (unsigned int) input;

  sin = itmp >> (size - 1);
  sign = sin ^ 1;

  // now "sign" is either 0 (negative) or 1 (positive)
  // but we need 1 (negative) and -1 (positive)
  // 0 * -2 + 1 = 1
  // 1 * -2 + 1 = -1

  sign = sign * -2 + 1;

  // Now we can do
  // in   sign   out   sin   sout
  // -x *   1 = -x ->   1  +  1  =  2
  // +x *  -1 = -x ->   0  +  1  =  1
  //  0 *  -1 =  0 ->   0  +  0  =  0

  itmp = itmp * sign;
  sout = itmp >> (size - 1);

  sign = sin + sout;

  printf("Input: %c\n", out[(size_t) sign]);

  exit(EXIT_SUCCESS);
}

没有条件表达式,既不是if明确的,也不是whilefor的隐含,也不是快捷...?...:...