类似的assert语句给出不同的结果

问题描述 投票:2回答:1

在以下代码中:

#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. 输入不同的整数或不同的字符,第一个assert语句中止程序。 (应如此)。
  2. 但是,如果在此代码中输入相等的整数(非3)和相同的字符,则第一个assert语句不会终止程序,但是第二个assert语句会终止。

第一个断言语句是否很弱,或者我对断言语句是否有所了解?

c++ assert
1个回答
2
投票

[a==b,a*b==9,c==dcomma expression;

在逗号表达式E1,E2中,对表达式E1求值,其结果将被丢弃(尽管它具有类类型,但不会销毁直到包含完整表达式的末尾),其在评估表达式E2之前完成副作用开始(请注意,用户定义的运算符不能保证排序)(直到C ++ 17)。

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.