【问题标题】:Trouble with increment operator [duplicate]增量运算符的问题[重复]
【发布时间】:2017-06-23 08:07:06
【问题描述】:

这是我在入门级计算机编程课程中遇到的示例代码:

 #include <stdio.h>
 int main()
 {
     int l = 20, m = 10;
     int z;
     z= l++ || m++;
     printf("z = %d l = %d m = %d\n", z, l, m);
 }

代码打印 l=21, m=10 和 z=1 l 和 z 的值是我所期望的,但 m 的值让我感到不安。不应该是 11,因为代码中存在 m++。

【问题讨论】:

  • 如果您知道z = 1 是正确的,那么您就可以弄清楚为什么m++ 从未被执行。

标签: c operators


【解决方案1】:
z= l++ || m++;

在您的表达式中,l 首先赋值,然后递增一个。

逻辑或(||)运算中,如果左操作数非零,则右操作数不计算,并且结果是真的。这就是为什么 l 变成 21 并且 m 没有被评估,它的值是 10

C 标准(N1256 : 6.5.14-paragraph 4)说:

不同于按位 |运算符,||运营商保证 从左到右的评估; 后面有一个序列点 评估第一个操作数。如果第一个操作数比较不相等 为 0,不计算第二个操作数

【讨论】:

  • 你的意思是它先被评估,对吧?
  • @Iharob 在逻辑与运算中,首先检查左操作数的值,如果为真则不检查右操作数的值。
  • @KeineLust 谢谢你的建议。
  • Nitpick:未指定增量是在分配之前还是之后完成。所有后增量运算符保证是产生增量之前的值并且在下一个序列点完成增量。哦,C99 是不是标准,它已在 6 年前随着 C11 的发布而被取消。在这里没有什么区别,但无论如何你都应该更新你的文档。
【解决方案2】:

您所看到的称为短路评估。

您的线路在这里:

 z= l++ || m++;

说,检查 l 的值(检查时增加)。如果 l 为非 0,则将 z 设置为 1。如果 l 为 0,则检查 m 的值(检查时递增)。如果 m 为非 0,则将 z 设置为 1。否则将 z 设置为 0。

本质上,当两个检查中的第一个 (l++) 已经评估为 true 时,系统不需要检查第二个条件,因此它不会,因此也无法增加 m。

【讨论】:

    【解决方案3】:

    这是因为m++ 只有在l++ == 0 时才会执行。由于l++ 的计算结果为20,因此永远不会执行m++。如果l 最初是0,那么m++ 将被执行。

    【讨论】:

    • 我认为最好解释一下短路评估,以便更好地理解原因。
    猜你喜欢
    • 1970-01-01
    • 2023-03-26
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-25
    • 2013-08-22
    • 2016-02-02
    相关资源
    最近更新 更多