【问题标题】:similar assert statements giving different results类似的断言语句给出不同的结果
【发布时间】:2020-08-13 00:10:07
【问题描述】:

在以下代码中:

#include <iostream>
#include <assert.h>
int main()
{
    int a,b;
    cin>>a>>b;
    char c,d;
    cin>>c>>d;
    assert ((a==b,a*b==9,c==d));
    assert ( a==b && a*b==9 && c==d );
}

如果你:

  1. 输入不同的整数或不同的字符,第一个断言语句中止程序。 (应该如此)。
  2. 但是,如果您在此代码中输入相等的整数(3 除外)和相同的字符,则第一个 assert 语句不会中止程序,但第二个 assert 语句会。

第一个断言语句是弱还是我不知道断言语句?

【问题讨论】:

    标签: c++ assert comma-operator


    【解决方案1】:

    a==b,a*b==9,c==d 是逗号表达式。对于built-in comma operator

    在逗号表达式E1, E2 中,表达式E1 被求值,它的 结果是discarded(虽然如果它有类类型,它不会是 销毁until the end of the containing full expression),及其 在评估表达式 E2 之前完成副作用 开始

    逗号结果的类型、值、值类别 表达式正是 第二个操作数,E2

    它返回最后一个操作数作为它的返回值,即c==da==ba*b==9 得到评估,但它们的结果被丢弃。所以assert ((a==b,a*b==9,c==d)); 实际上只检查c==d

    另一方面,assert ( a==b &amp;&amp; a*b==9 &amp;&amp; c==d ); 检查所有条件;通过&amp;&amp;连接的都必须是true才能通过检查。

    【讨论】:

      【解决方案2】:

      1.输入不同的整数或不同的字符,第一个 assert 语句中止程序。 (应该如此)。

      一般表达式中逗号运算符的含义

      e1 , e2
      

      is - 计算子表达式e1,然后计算e2;表达式的值是e2 的值。

      所以,表达式的值

      a==b,a*b==9,c==d
      

      是价值

      c==d
      

      当您在assert() 中使用此表达式时,如果c==d 导致false,无论ab 的值如何,assert() 都会导致程序终止。

      2.但是,如果您在此代码中输入相等的整数(3 除外)和相同的字符,则第一个 assert 语句不会中止程序,但第二个 assert 语句会。

      逻辑与运算expr1 &amp;&amp; expr2 采用短路行为。使用逻辑短路,第二个操作数 expr2 仅在结果未完全由第一个操作数 expr1 确定时才被计算。 也就是说,如果expr1 是逻辑0 (false),则不会评估expr2

      在第二个assert()给出的表达式中

      a==b && a*b==9 && c==d
      

      您拥有a*b==9 以及a==bc==d。因此,只有当给定输入 3ab 并且输入相同的字符值输入到 cd 时,这个表达式才会导致 true,否则这个表达式会导致 false 并且断言会导致程序终止。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-04
        • 1970-01-01
        • 2021-06-05
        • 2014-08-15
        • 2020-08-28
        • 2017-10-11
        • 1970-01-01
        • 2016-12-30
        相关资源
        最近更新 更多