如何解决什么是测试零长度字符串的有效方法:`strlen(str) > 0` 或 `*str`
假设 SELECT day,count(event_id) as doc_count,count(distinct event_id) as unique_values
FROM generate_series('2021-03-10T00:00:00','2021-03-15T00:00:00',interval '1 day') as g(day)
LEFT JOIN test ON date_trunc('day',tstamp) = day
GROUP BY day
ORDER BY day;
,用以下方法测试空字符串
char *str;
什么是最可取的使用?我认为第二个会更快,因为它不必遍历缓冲区来获得长度。还有使用第二个的缺点吗?
解决方法
方法 2,因为如果字符串不为空,第一次尝试将遍历字符串。不,方法 2 没有缺点。
,我会给出我认为更好的第三种选择:
if (str && str[0]) {
// ...
}
strlen
方法并不理想,因为它可以迭代非零长度的字符串。编译器可能会完全优化该调用(正如已指出的那样),但不会在每个编译器上进行(我假设 -ffreestanding
选项会禁用此优化),并且至少使它看起来更像工作需要进行。
不过,我认为 [0]
的意图比 *
清楚得多。我通常建议在取消引用指向单个对象的指针时使用 *
,并在该指针指向数组的第一个元素时使用 [0]
。
为了更清楚,你可以这样做:
if (str && str[0] != '\0') {
// ...
}
但这开始使特殊字符与字母字符的比率变得难以阅读。
,最好使用什么?
显然是第一,因为它最易读。
,我会忽略性能问题。 CLANG 和 GCC 都会为“-O3”选项生成相同的代码。
第一种方法更明确地表达了程序员的意图。
,如果您启用了优化,编译器不太可能生成不同的代码。但是如果性能真的是一个问题,那么使用第二种方法可能会更好。我说可能,因为它不是 100% 确定的。谁知道优化器会做什么?但是如果字符串不为空,第一种方法可能会遍历整个字符串。
说到可读性,我想说第一个更易读。然而,使用 *str
来测试空字符串在 C 中是非常惯用的。任何经验丰富的 C 编码员都会立即理解它的含义。所以TBH,可读性问题主要是为了防止不是C程序员的人阅读代码。如果有人不了解 if (str && *str)
的作用,那么您也不希望他们修改代码。 ;)
如果您正在处理的代码库有编码标准,请坚持下去。如果没有,请选择您最喜欢的一个。没关系。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。