【问题标题】:A conditional statement that I can't understand我看不懂的条件语句
【发布时间】:2022-01-10 19:51:18
【问题描述】:

我在一个 C++ 教程视频中看到了几行代码

void copy_string(char* from, char* to)
{
    while ((*to = *from) != '\0')
    {
        to++;
        from++;
    }
}

该函数用于将字符串“from”复制到字符串“to”中,但是我无法理解while循环内的条件语句。为什么可以同时赋值和比较?

【问题讨论】:

  • en.cppreference.com/w/c/language/operator_assignment: "返回一个左值,标识修改后的左操作数。"。
  • 这个问题应该标记为C;它与 C++ 无关。赋值运算符 (=) 返回分配的值,然后可以像任何其他值一样在表达式中使用该值。此外,可以编写while (*to++ = *from++); 来实现(几乎)相同的事情,但这会在最后做两个额外的无用增量(编译器可能会或可能不会优化,具体取决于具体情况)。最后但并非最不重要的一点是,这种方法可能很危险:如果to 指向的缓冲区比from 中到'\0' 的距离短,那么一切都会崩溃。
  • "为什么可以同时赋值和比较?" ...因为那里写了一个赋值运算符(=)和一个比较运算符(!=)?为什么不能呢?
  • @AndrejPodzimek:如果 OP 使用 C++ 编译器来编译代码,那么根据标签描述,将其标记为 C++ 而不是 C 是正确的,即使代码是“C 风格"。
  • @selbie 更简单:while (*to++ = *from++);

标签: c++ string conditional-statements


【解决方案1】:

为什么可以同时赋值和比较?

相同的表达式既可以赋值又可以比较,因为它包含用于每个目的的单独运算符。

= 是一个赋值运算符。它将右侧操作数的值分配给左侧操作数(这在技术上是一个副作用),并计算分配的值。它评估为一个值可能是您缺少的点。

!= 是一个比较运算符。它确定其左侧和右侧操作数的值是否不相等。如果是,则评估为 1,否则,评估为 0。

还有==,一个比较运算符,它在不修改任何一个值的情况下评估其左侧和右侧操作数的值是否相等(与!=相反)。

但请注意,尽管整个表达式同时执行赋值和比较,但它们不一定同时发生

【讨论】:

    【解决方案2】:

    既是作业*to = *from,也是比较

    (*to = *from) != 0
    

    它首先将取消引用的指针从“from”分配给“to”,然后检查分配的值是否等于 0,即空终止符。如果是,则退出循环,复制完成。

    【讨论】:

      猜你喜欢
      • 2013-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-15
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      相关资源
      最近更新 更多