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



在以下代码中:

#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(和相同的字符,那么第一个断言语句不会中止程序,而第二个断言语句会中止程序

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

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

在逗号表达式E1, E2中,表达式E1被求值,其结果被丢弃(尽管如果它具有类类型,则不会销毁,直到包含完整表达式结束(,及其副作用在评估表达式E2之前完成开始

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

它返回最后一个操作数作为返回值,即c==d。对CCD_ 7和CCD_。所以assert ((a==b,a*b==9,c==d));实际上只检查c==d

另一方面,CCD_ 11检查所有条件;则经由CCD_ 12连接的所有节点都必须是CCD_。

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

通用表达式中逗号运算符的含义

e1 , e2

是-评估子表达式e1,然后评估e2;表达式的值是CCD_ 16的值。

因此,表达式的值

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

是的值

c==d

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

2。但是,如果在这段代码中输入了相等的整数(而不是3(和相同的字符,那么第一个断言语句不会中止程序,而第二个断言语句会中止程序

逻辑与运算expr1 && expr2采用短路行为。在逻辑短路的情况下,只有当第一个操作数expr1没有完全确定结果时,才计算第二个操作数,expr2。也就是说,如果expr1是逻辑0(false(,则不评估expr2

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

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

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

相关内容

  • 没有找到相关文章

最新更新