嵌套if语句路径数及多层循环代码路径数计算咨询
嵌套if语句的路径数计算问题
我想了解嵌套if语句的路径数计算方式,比如下面这段代码中,main函数的路径数是多少?
void main() { int i = 0, j = 0, k = 0; for (i=0; i<10; i++) { for (j=0; j<10; j++) { for (k=0; k<10; k++) { if (i < 2 ) printf("value is more than 2\n"); if (i > 5) printf("value is less than 5\n"); } } } }
我认为前三个for循环对应3条路径,加上一条绕过所有控制流语句的路径,但不确定嵌套if语句的路径数是不是1×1=1条?
官方参考规则(翻译)
控制流语句会引入分支,在原有1条路径的基础上增加路径数:
- if系列结构:每个
if关键字对应一个新分支。if-else if-else结构的路径贡献数为分支数加1(原有路径);若存在兜底else,所有路径都会进入该结构,否则存在一条绕过结构的路径。
例:包含if(..){} else if(..){} else{}的函数有3条路径;仅含if(){}的函数有2条路径——一条进入if块,一条绕过if块。- for/while循环:每个循环语句引入一个新分支,路径贡献数为2——一条进入循环(执行至少一次),一条绕过循环。
- 顺序无嵌套的控制流:总路径数为各语句路径贡献数的乘积。
例:包含3个for循环和2个if-else块的函数,总路径数为2×2×2×2×2=32。
再看官方示例代码:
void func() { int i = 0, j = 0, k = 0; for (i=0; i<10; i++) { for (j=0; j<10; j++) { for (k=0; k<10; k++) { if (i < 2 ) ; else { if (i > 5) ; else ; } } } } }
该示例中,
func共有6条路径:3条来自循环的不同进入层次(仅进第一个循环、进前两个循环、进所有三个循环),2条来自if结构的分支,加上1条绕过所有控制流的原始路径。
问题解答
按照官方规则,你的代码总路径数为7条,具体拆解:
- 循环部分的静态路径:
- 绕过第一个for循环:1条
- 进入第一个for,但绕过第二个for:1条
- 进入前两个for,但绕过第三个for:1条
- 进入所有三个for:这部分会走到内部的if语句,对应多条路径
- 内部if语句的路径:
两个独立的无else if语句,每个都有「进入/绕过」2种分支,且顺序执行无嵌套,所以路径数为2×2=4条 - 总路径数:前3条循环路径(未走到if) + 进入所有循环后的4条if路径 =
3+4=7条
你之前对if路径数的猜测错误,因为每个无else的if本身就有2条路径,两个独立if的路径数是乘积关系,而非1×1。
内容的提问来源于stack exchange,提问作者naomikim
相关产品推荐
相关产品推荐

