我需要使用布尔表达式而不是诸如c:b的术语? A,切换,否则...如果。并不允许同时使用for / while-do / while。
我的问题是,当接收到一个名字时,我们根据其值决定要打印的内容。例如,如果名称短于6个字母,我们打印“发送了玩家A”,如果字母总和(以ascii值表示)大于20,则我们向玩家B发送类似的东西。此外,如果我们可以派遣多名玩家,我们将选择发送最大的词典编排玩家(playerC 我试图做的就是这样 所以其余的应该是 但是正如我所说,我不能使用if和else或类似条件。对于最后一部分的帮助将不胜感激。 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');
答案 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()
但是仅保证成功时返回非负值,该值包括零,因此不应使用。