使用布尔表达式代替if / else或类似条件

时间:2019-04-10 18:59:53

标签: c boolean-expression

我需要使用布尔表达式而不是诸如c:b的术语? A,切换,否则...如果。并不允许同时使用for / while-do / while。

我的问题是,当接收到一个名字时,我们根据其值决定要打印的内容。例如,如果名称短于6个字母,我们打印“发送了玩家A”,如果字母总和(以ascii值表示)大于20,则我们向玩家B发送类似的东西。此外,如果我们可以派遣多名玩家,我们将选择发送最大的词典编排玩家(playerC

我试图做的就是这样

  bool sum = AsciiSum(name)>=20;
  bool len = NameLength(name)<6;
...

所以其余的应该是

if(sum) 
  printf("%c\n" ,'playerA');
else if (len) 
  printf("%c\n" ,'playerB');
else 
  printf("%c\n" ,'no player was sent');

但是正如我所说,我不能使用if和else或类似条件。对于最后一部分的帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

执行此操作的一种方法是通过自定义打印函数重新路由输入,该函数将返回布尔值。也就是说,您可以只使用AND(&&)运算符来调用它。

示例代码:

bool printMessage(char* string)
{
    printf("%s", string);
    return true;
}

bool sum = AsciiSum(name)>=20 && printMessage("playerA");
bool len = NameLength(name)<6 && printMessage("playerB");
// ... etc

为什么这样做?如果第一个条件为真,AND运算符将仅允许检查下一个条件。由于您的条件是要打印消息,总和必须为真,因此这是一种无需直接使用任何if / else语句即可调用打印方法的方法

编辑:Johnny Mopp建议的一种更好的方法是使用stdio puts(),该函数返回一个整数(这是布尔函数的含义)。

bool sum = AsciiSum(name)>=20 && puts("playerA");
bool len = NameLength(name)<6 && puts("playerB");

使用此方法,即使您应该选择使用任何更舒适的方法,也不必创建printMessage函数。

答案 1 :(得分:1)

给出始终返回true的输出函数:

bool print( const char* msg )
{
    puts( msg ) ;
    return true ;
}

您可以这样利用短路评估:

bool sum = AsciiSum(name)>=20;
bool len = NameLength(name)<6;

(sum && print("playerA")) || 
(len && print("playerB")) || 
print("no player was sent") ;

如此测试所有组合:

bool sum = false, len = false ;
(sum && print("playerA")) || (len && print("playerB")) || print("no player was sent") ;

sum = false, len = true ;
(sum && print("playerA")) || (len && print("playerB")) || print("no player was sent") ;

sum = true, len = false ;
(sum && print("playerA")) || (len && print("playerB")) || print("no player was sent") ;

sum = true, len = true ;
(sum && print("playerA")) || (len && print("playerB")) || print("no player was sent") ;

正确输出:

no player was sent                                                                                                                                       
playerB                                                                                                                                                  
playerA                                                                                                                                                  
playerA  

您的编译器可能会针对未使用表达式的结果发出诊断;可以通过虚拟分配来抑制:

bool dummy = (sum && print("playerA")) || 
             (len && print("playerB")) ||  
             print("no player was sent") ; 

或将整个表达式强制转换为void:

(void)((sum && print("playerA")) || 
       (len && print("playerB")) || 
       print("no player was sent")) ;

输出函数的唯一要求是它返回一个非零值以使||短路,为此,如果消息不是空字符串,printf()将起作用,并且避免定义特定的输出函数。

(void)((sum && printf("playerA\n")) || 
       (len && printf("playerB\n")) || 
       printf("no player was sent\n")) ; 

puts()但是仅保证成功时返回非负值,该值包括零,因此不应使用。