如何利用按位或简化含strcmp函数的if条件判断语句?
问题解答
首先明确:不能通过按位或(|)结合strcmp来简化这段代码,原因如下:
strcmp返回值逻辑与按位或不匹配strcmp返回0表示字符串相等,返回非0值(正/负)表示不等。原代码的逻辑是「只要任意一个strcmp返回0,条件成立」。如果强行用按位或连接多个strcmp的返回值,再判断是否等于0,只有当所有strcmp都返回0时,按位或的结果才会是0,这和原逻辑完全相反;如果判断按位或结果是否非0,那只有当所有strcmp都返回非0时才会不成立,同样不符合需求。按位或会破坏短路求值特性
原代码的逻辑或(||)具备短路求值:只要前面的strcmp返回0,后面的就不会执行,能节省不必要的计算。而按位或(|)会强制计算所有操作数,反而降低效率。
正确的简化方式
如果想缩短代码,更合理的做法是封装一个辅助函数来判断字符串是否匹配数组中的任意元素:
#include <string.h> // 判断str是否匹配arr中的任意一个字符串,count为arr的元素个数 int str_matches_any(const char *str, const char **arr, int count) { for (int i = 0; i < count; i++) { if (strcmp(str, arr[i]) == 0) { return 1; // 找到匹配,立即返回 } } return 0; // 无匹配 }
之后原代码可以简化为:
if (str_matches_any(level, array + 1, 3)) { // array+1指向array[1],共3个元素 /* Code */ }
这种方式既简化了主逻辑代码,又保留了短路求值的效率,同时可读性更强。
内容的提问来源于stack exchange,提问作者JL Minty
相关产品推荐
相关产品推荐

