if判断无显式比较时string.size()为何可直接作为布尔值使用
if(!word.size()){ return true; }
写法的语法原理
这种写法依赖C++的标量类型到布尔值的隐式转换规则,和string.size()本身的返回值特性无关:
- 首先
std::string::size()的返回值是无符号整型size_t,值对应当前字符串的字符长度,空字符串时返回值为0,非空时返回正整数。 - C++语法规定,所有整型、浮点型、指针类型这类标量值,出现在
if判断、逻辑运算(!/&&/||)这类需要布尔值的语境时,会自动做隐式类型转换:- 值为0时,转换得到布尔值
false - 值为任意非0值时,转换得到布尔值
true
- 值为0时,转换得到布尔值
对应这段代码的执行逻辑:
- 当
word是空串时,word.size()返回0,隐式转换为false,经过!取反后得到true,满足if条件,进入分支返回true - 当
word非空时,word.size()返回大于0的正整数,隐式转换为true,取反后得到false,不进入if分支
这是C/C++开发里非常普遍的简写写法,和显式写
if(word.size() == 0)的执行逻辑完全一致,只是省略了和0的显式比较,靠语言内置的隐式转换完成判断。同理常见的空指针判断if(!ptr),也是依赖同一个转换规则:空指针值为0转false,取反后为true进入分支。
内容的提问来源于stack exchange,提问作者piercashuang
相关产品推荐
相关产品推荐

