c - 查找此输出的逻辑

标签 c

解释这个输出是如何产生的。

#include <stdio.h>
int main()
{
  int x,y,z;
  x = y = z = -1;
  z = ++x && ++y && ++z;
  printf("%d %d %d", x, y ,z);
  return 0;
}

我以为 x,y,z 所有的值都会是 0 但实际输出是 x=0,y=-1,z=0。

最佳答案

这里涉及两件事:运算符关联性和short-circuit evaluation (请参阅链接以了解它是什么以及它的作用)。

由于 && 运算符的结合性,表达式 ++x &&++y &&++z 等于 (++x &&++y) &&++z.

如果我们执行子表达式 ++x &&++y 那么结果是 false++x 的结果是 0,所以我们有 0 &&++y。在 C 中,零与 bool 值 false 相同,并且由于短路评估 ++y 永远不会发生。 y 的值保持在 -1

因此对于第一个子表达式的结果,我们有 false &&++z。同样由于短路评估 ++z 从未发生,结果再次为 false

所以++x &&++y &&++z的结果是false,然后赋值给z。在赋值中, bool 值 false 被隐式转换为整数值 0。这是 z 的打印值。

关于c - 查找此输出的逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57157846/

相关文章:

c - STDERR 重定向到日志文件在删除日志文件时中断

c - 两个整数相除结果为 0,而我应该得到 1

c - 分割字符串的函数有时会出现段错误

c - 为什么 dup2 可以在这里工作?

将内存从地址复制到缓冲区而不是复制

c - 来自单词文件的链接列表

c - 如何在 FreeRTOS 中重新启动任务

c++ - swprintf 意外结果

CS50 恢复段错误问题

objective-c - 计算按位值的数量