6

我正在大学的软件质量保证课程中学习圈复杂性,当您在谓词语句或节点中有复合条件时,我很难理解它是如何工作的。我见过多种圈复杂度的定义,我在课堂上使用的主要定义是

V(G) = # of predicate nodes (with outdegree = 2) + 1

因此,对于这样的程序图,我们的圈复杂度为 2:

V(G) = 2

圈复杂度为 2 的程序图

我还看到了给出的圈复杂度的定义

V(G) = # edges - # nodes + 2

这也适用于上面给出的图表。但是,我们有谓词节点的复合条件。我们考虑为自动短路设置的语言和系统,在我看来,左下角的图表必须扩展到图表。如果是下面这样的情况,圈复杂度是否会变为 3,即使在真正的源代码中,我们可能只有一个 if 语句,还是仍然是 V(G) = 2?.

这很令人困惑,因为我看到的大多数圈复杂度的定义都在谈论谓词节点,而且据我所知,谓词可能包含多个短路条件。如果不是这种情况,那么短路行为似乎在提高性能的同时,在考虑时实际上会提高循环复杂度。如果给出源码,是不是所有的条件都要分解成自己的节点,比如左图,才能计算圈复杂度? 扩展程序图以显示短路行为

4

1 回答 1

2

在 C(C++、Java、C#)中,“&&”运算符增加了复杂性,因为它被定义为使用短路评估。在这种情况下,圈复杂度为 3。

http://hissa.nist.gov/HHRFdata/Artifacts/ITLdoc/235/chapter4.htm

“布尔运算符增加或不增加复杂性,这取决于它们是否具有可能导致有条件执行副作用的短路评估语义。”

图 4-4 有带注释的源代码和相应的流程图,展示了如何确定复杂性。

另请参见IF((A>B) AND (C>D)) 和 IF((A>B) OR (C>D)) 的圈复杂度

于 2013-03-09T02:36:48.970 回答