c - 基本逻辑运算符问题

标签 c operators

#include <stdio.h>
int main()
{
    int k=5;
    if(++k < 5 && k++ / 5 || ++k <= 8)
    {
         printf("%d",k);
    }
    return 0;
}

为什么输出的是7而不是8?(我是编程初学者所以请多多包涵。)

最佳答案

Operator precedence和逻辑表达式 short circuit evaluation .

&&在您的逻辑条件下,绑定(bind)比 || 更紧密,所以你的条件相当于:

((++k<5 && k++/5) || ++k<=8)

以结构化方式呈现的代码更容易阅读,如下所示:

int main() {
    int k=5;
    if ((++k<5 && k++/5) || ++k<=8) {
        printf("%d",k);
    }
    return 0;
}

现在逐个执行。

  1. k 5 点开始。
  2. ++k<5预付款 k到 6,不是 <5 .
  3. 下半场&&表达式永远不会被评估,因为 0 && ANYTHING == 0 .
  4. 因为 || 的左侧为 0,右侧短路。必须对其进行评估。
  5. ++k<=8预付款 k到 7, <=8 .
  6. 总条件计算结果为 1,因为 || 的右侧是 1。
  7. if 的“then”子句语句被执行。
  8. k 的当前值,即 7,被打印出来。
  9. 程序返回 0,并终止。

还值得注意的是,您的 && 的后半部分子句可能没有按照您的意图进行。 k++/5是整数除法,并且由于 k>5在任何时候,k++/5永远是>=1因此总是正确的。

关于c - 基本逻辑运算符问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25577166/

相关文章:

c - 从线程返回 "string"

c - 使用 (2^32-1) 或 (2^64-1) 或更多的 for 循环所花费的时间是相同的

c++ - cout 的 << 运算符在运算符优先级方面如何工作?

java - 为什么 10>>2+5>>2 的计算结果为零?

c++ - 是>?或 <?任何 C++ 方言中的合法运算符?

python - 什么是 `1..__truediv__` ? Python 是否有 .. ("dot dot") 表示法语法?

c - 在线程创建时将一个简单整数传递给线程的启动函数

对这段 C 代码感到困惑

比较十六进制值中的 n 个字符序列

c++ - 这个 C++ 宏有什么作用?