在以下代码中:
#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 );
}
如果您:
- 输入不同的整数或不同的字符,第一个断言语句将中止程序。(应该如此(
- 但是,如果在这段代码中输入了相等的整数(而不是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
,则无论a
和b
的值如何,assert()
都会导致程序终止。
2。但是,如果在这段代码中输入了相等的整数(而不是3(和相同的字符,那么第一个断言语句不会中止程序,而第二个断言语句会中止程序
逻辑与运算expr1 && expr2
采用短路行为。在逻辑短路的情况下,只有当第一个操作数expr1
没有完全确定结果时,才计算第二个操作数,expr2
。也就是说,如果expr1
是逻辑0
(false(,则不评估expr2
。
在第二个assert()
中给出的表达式中
a==b && a*b==9 && c==d
您有a*b==9
以及a==b
和c==d
。因此,该表达式仅在给定输入3
到a
和b
以及输入相同字符值到c
和d
时才导致true
,否则该表达式导致false
并且断言导致程序终止。