表达式 `if (!(--indegree[v]))` 在逻辑上等价于检查 `indegree[v]` 在减去 1 后是否为 0。这里的 `!` 是逻辑非操作符,它将一个布尔值反转。在这个上下文中,它用来检查 `indegree[v]` 减 1 后的结果是否为零(即是否为假,因为在计算机语言中,0 通常被视为 false,任何非零值都被视为 true)。
让我们逐步分解这个表达式:
1. `--indegree[v]`:这个操作符会使 `indegree[v]` 的值先减 1,然后返回减 1 后的值。假设 `indegree[v]` 初始为某个正整数 n,那么执行 `--indegree[v]` 后,`indegree[v]` 将变为 n - 1,并且这个新值也会作为表达式的值。
2. `!(...)`:这个操作符取其内部表达式的逻辑反。如果 `--indegree[v]` 的结果是 0,那么 `!0` 为 true;如果 `--indegree[v]` 的结果是非零值,那么 `!non_zero_value` 为 false。
因此,`if (!(--indegree[v]))` 的逻辑可以理解为:
- 如果 `indegree[v]` 减 1 后的结果为 0,则条件成立(即进入 if 语句块)。
- 如果 `indegree[v]` 减 1 后的结果不为 0,则条件不成立(即跳过 if 语句块)。
这种写法常见于拓扑排序算法中,其中需要找出那些没有前置任务(即入度为 0 的节点)的任务并将其加入到结果序列中。当一个节点的所有前置节点都已经被处理后,该节点的入度会被递减至 0,此时该节点就可以被处理了。