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”是什么意思

  • 谢谢你的帮助

    • *s
      检测字符串终止字符“\0”
    • (h*17)^*s
      就是它所说的:h乘以17,然后用s所指字符的内容进行异或运算。似乎是一个简单的散列函数
  • 这怎么可能是一种状况?这是什么意思
  • 这意味着“当
    s
    指向的值不是零时。”C字符串以空结尾,因此
    C_str()
    返回的字符串中的最后一个字符将是空字符(
    \0
    ,由所有位零表示)

  • “h=(h*17)^*s”是什么意思 它将
    h
    乘以
    17
    ,然后
    xor
    s它与
    s
    指向的值相乘

  • *s
    s
    当前指向的字符,因此它是一个字符。
    for
    循环一直持续到它变成
    \0
    ,这意味着直到字符串结束
  • h
    被分配了
    h*17
    的值和字符
    *s
    的(ascii值)
  • 这是一个关于指针的好教程。

    1)
    *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/<代码>所指的字符xOffice一起,结果成为H的新值。

    < P>其他答案已经解释,基本答案是,任何计算到0的表达式都被解释为C或C++中的“false”条件,以及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++中,<<代码> > <代码>语句是按照<代码>定义的,而语句,而<<代码>的条件部分,语句控制迭代(65.1/1)while语句“:”/P> 直到条件值变为
    false

    <> >前面的C++标准,下面描述表达式如何转换为<代码>布尔O/COD>(4.12个布尔转换):

    算术、枚举、指针或指向成员类型的指针的右值可以转换为bool类型的右值。零值、空指针值或空成员指针值将转换为false;任何其他值将转换为true

    标准中类似的措辞(两种语言)适用于所有选择或迭代语句的控制表达式/条件。所有这些语言律师都归结为这样一个事实:如果表达式的计算结果为0,则与计算结果为false相同(在英语意义上,因为C doe