C++ char*如何成为for循环中的条件?
在我读的一本书中,有一段代码:C++ char*如何成为for循环中的条件?,c++,c,C++,C,在我读的一本书中,有一段代码: string x; size_t h=0; for(const char* s=x.c_str();*s;++s) h=(h*17)^*s; 关于此代码,我有两个问题: *s如何成为一种条件?这是什么意思 “h=(h*17)^*s”是什么意思 谢谢你的帮助 *s检测字符串终止字符“\0” (h*17)^*s就是它所说的:h乘以17,然后用s所指字符的内容进行异或运算。似乎是一个简单的散列函数 这怎么可能是一种状况?这是什么意思 这意味着“当s指向的值
string x;
size_t h=0;
for(const char* s=x.c_str();*s;++s)
h=(h*17)^*s;
关于此代码,我有两个问题:
*s
如何成为一种条件?这是什么意思“h=(h*17)^*s”是什么意思
检测字符串终止字符“\0”*s
就是它所说的:h乘以17,然后用s所指字符的内容进行异或运算。似乎是一个简单的散列函数(h*17)^*s
s
指向的值不是零时。”C字符串以空结尾,因此C_str()
返回的字符串中的最后一个字符将是空字符(\0
,由所有位零表示)
h
乘以17
,然后xor
s它与s
指向的值相乘
*s
是s
当前指向的字符,因此它是一个字符。for
循环一直持续到它变成\0
,这意味着直到字符串结束h
被分配了h*17
的值和字符*s
的(ascii值)*s
在条件中检查是否*s=NUL
<代码> h=(h*17)^ *s<代码>表示乘以<代码> h <代码> 17,执行代码>独占或<代码> >操作,在C和C++中,由S.< /P> < P>所指的值,<代码>真< /COD>和<代码> false <代码>与非零和零相同。因此,
if(1){
下的代码将始终执行,正如if(-1237830){
下的代码一样,但是if(0){
下的代码始终是false
同样,如果指针的值为0,则条件与false
相同,即您将退出循环。在C(或C++)中,任何值都可以用作“布尔值”。0的数值或空指针表示“false”。其他任何值都表示“true”
这里,*s
是“当前由s
指向的字符值”。如果该字符是0(不是ASCII编码为48的“0
”数字,而是ASCII编码为0的字节),则循环停止。这通常是“字符串结束”标记,因此循环在到达字符串结束时停止
“
^
”是按位异或运算符。左侧“*
”是纯乘法,而另一个“*
”是指针解引用运算符(即,取指针s
并查看该指针指向的值的对象)。”=
“简而言之,<>代码> h <代码>的值乘以17,然后与s
指针到达字符串('\0')的空终止字符时,ode>*s将计算为0
您可以等效地使用表达式*s!=0
,一些开发人员可能会认为这是应该使用的,并认为“更完整”的表达式更清晰。无论您是否同意该观点,您都需要能够理解简洁替代方法的用法,因为它在C/C++co中非常常用你会经常遇到这些表达式,即使你更喜欢使用更明确的比较
标准中更严格的解释(出于某种原因,我觉得有必要将其纳入讨论,尽管它并没有真正改变或澄清任何事情。事实上,它可能会对某些人造成不必要的混乱-如果你不想进入这一级别的琐事,现在单击“上一步”按钮,你绝对不会错过任何东西……:
在C语言中,*s
表达式位于标准所称的for
语句的“expression-2”中,这个特殊的for
语句示例只是利用了标准对for
语句的定义。for
语句被分类为“迭代语句”,并且任何迭代语句的语义如下(6.8.5/4“迭代语句”):
迭代语句导致称为循环体的语句重复执行
直到控制表达式比较为0为止
由于for
语句的“expression-2”部分是控制表达式,这意味着for
循环将重复执行,直到*s
比较等于0为止
<> > C++标准对事物的定义有点不同(但结果相同)。在C++中,<<代码> > <代码>语句是按照<代码>定义的,而false
<> >前面的C++标准,下面描述表达式如何转换为<代码>布尔O/COD>(4.12个布尔转换):
算术、枚举、指针或指向成员类型的指针的右值可以转换为bool类型的右值。零值、空指针值或空成员指针值将转换为false;任何其他值将转换为true
标准中类似的措辞(两种语言)适用于所有选择或迭代语句的控制表达式/条件。所有这些语言律师都归结为这样一个事实:如果表达式的计算结果为0,则与计算结果为false相同(在英语意义上,因为C doe