C++ 给出不同结果的类似断言语句

C++ 给出不同结果的类似断言语句,c++,assert,comma-operator,C++,Assert,Comma Operator,在以下代码中: #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 ); } #包括 #

在以下代码中:

#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 );
}
#包括
#包括
int main()
{
INTA,b;
cin>>a>>b;
c,d;
cin>>c>>d;
断言((a==b,a*b==9,c==d));
断言(a==b&&a*b==9&&c==d);
}
如果你:

  • 输入不同的整数或字符,第一个assert语句将中止程序。(应该如此)
  • 但是,如果在此代码中输入相等的整数(3除外)和相同的字符,则第一条assert语句不会中止程序,而第二条assert语句会中止程序
    第一个assert语句是否很弱,或者我对assert语句有什么不知道的吗?

    a==b,a*b==9,c==d是逗号表达式。用于:

    在逗号表达式
    E1,E2
    中,计算表达式
    E1
    ,其 结果是(尽管如果它有类类型,则不会是 销毁),及其 副作用在表达式评估前完成
    E2
    开始

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

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

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

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

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

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

    那么,表达式的值呢

    a==b,a*b==9,c==d
    
    价值何在

    c==d
    
    assert()
    中使用此表达式时,如果
    c==d
    导致
    false
    ,则无论
    a
    b
    的值如何,
    assert()
    都会导致程序终止

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

    逻辑与运算
    expr1和&expr2
    采用短路行为。对于逻辑短路,只有当第一个操作数expr1
    不能完全确定结果时,才会对第二个操作数expr2
    求值。 也就是说,如果
    expr1
    是逻辑
    0
    (false),则不计算
    expr2

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

    你有
    a*b==9
    以及
    a==b
    c==d
    。因此,只有当将
    3
    输入到
    a
    b
    并将相同的字符值输入到
    c
    d
    时,此表达式才会生成
    true
    ,否则此表达式会生成
    false
    ,断言会导致程序终止

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