我正在努力解决流动的问题:
您将获得一个名为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:使用? :运营商被认为是作弊!
答案 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
明确的,也不是while
或for
的隐含,也不是快捷...?...:...
。