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

sho*_*ace 3 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 );
}
Run Code Online (Sandbox Code Playgroud)

如果你 :

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

第一个断言语句是弱的还是我对断言语句不了解?

son*_*yao 5

a==b,a*b==9,c==d是逗号表达式。对于内置逗号运算符

在逗号表达式中E1, E2,表达式E1被求值,其结果被丢弃(虽然如果它有类类型,它不会被销毁,直到包含完整的表达式结束),并且它的副作用在表达式的求值E2 开始之前完成

逗号表达式结果的类型、值和值类别正是第二个操作数 的类型、值和值类别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通过检查。