【问题标题】:What boolean value does an assignment operation implicitly evaluate to in C?赋值操作在 C 中隐式计算为什么布尔值?
【发布时间】:2012-08-20 08:38:43
【问题描述】:

我最近偶然发现了这段代码:

void strcat( char* dest, char* src )
{
     while (*dest) dest++;
     while (*dest++ = *src++);
}

看起来*dest++ = *src++ 操作被用作while 循环的条件。这个赋值操作如何转换为布尔值?我很难理解它。

此外,相同的语法在 C++ 中是否有效?

【问题讨论】:

  • 我想看到一个答案,涵盖如何/何时应用 ++ 运算符(或者如何为了讨论条件/赋值的东西而忽略它),只是快速传递,因为它有点神秘。另外,不要忘记这里的问题是 C++ 是否有相同的规则。

标签: c++ c conditional-statements


【解决方案1】:

在 C 语言中,逻辑语句中的非零值计为 true,零计为 false

而任何赋值语句的结果都是赋值后左操作数的值。

所以在第二个循环中,如果赋值为0,则条件结果为false。在第一个循环中,如果指向的变量本身的值为0,则条件为false

此语法在 C++ 中也有效。

【讨论】:

  • 为了完整性 - 上面的第二个循环将复制所有字符,包括 \0。
  • 赋值运算的结果是左操作数的值,而不是右操作数的值;这不一样,两者之间存在细微差别。
  • @pb2q "..and 布尔值和整数值之间的自动转换" -- 那么在条件中使用值之前,这里是否存在隐式/自动转换?
  • -1 表示 C++ 有正确的 bool 类型而 C 没有。自 C99 以来,C 具有 _Bool,而 "stdbool.h" 中的宏 boolfalsetrue
  • @pst 那么在条件中使用值之前,这里是否存在隐式/自动转换——我相信是这样的。来自6.4/4 选择语句作为表达式的条件的值是表达式的值,根据上下文转换为除switch 之外的语句的布尔值;。还有:6.4/2条件规则既适用于选择语句,也适用于 for 和 while 语句。但我现在已经从答案中删除了关于 bool 的部分,它确实需要工作。
【解决方案2】:

赋值操作在 C 中隐式求值为什么布尔值?

赋值操作对被赋值的变量求值(左侧):

int i = 0;
int j = (i = i+5); // j == 5 | (i = i+5) assigns 5, then evaluates to i

现在,当用作条件时,整数值在非零时计算为 true,如果为零则计算为 false

【讨论】:

  • 也赞成这个,因为我怀疑真正的问题不是关于布尔值,而是关于赋值操作结果的值。
  • “赋值操作计算出被赋值的值” 不,它不会计算出赋值后变量的值。试试unsigned char ch; printf("%d", (ch = 300));
  • @PascalCuoq:我可能没有使用正确的措辞。赋值表达式是一个左值表达式,它指向赋值的左侧(即,它评估被赋值的变量,然后可以进行左值到右值的转换以产生存储的值)
【解决方案3】:

计算结果为 0 的表达式为假。 计算结果为非零的表达式为真。

当 *dest 等于 0 时,第一个 while 循环将终止。

与第二个类似。

【讨论】:

  • 请考虑下次阅读该问题。我在问一个赋值操作如何计算为非零。
猜你喜欢
  • 2013-02-27
  • 2010-11-04
  • 2011-03-04
  • 2014-03-05
  • 1970-01-01
  • 2015-12-17
  • 2012-09-20
  • 1970-01-01
  • 2011-02-26
相关资源
最近更新 更多