为何第一个条件语句无法正确控制逗号分隔符的输出?
条件语句逻辑错误分析
先看完整的C代码:
#include <unistd.h> void triplet(void); int main(void) { triplet(); } void triplet(void) { char i, j, k; i = '0'; j = '1'; k = '2'; while (i < j) { i + 1; // 注:此行无实际作用,未对i赋值 k = j + 1; while (j < k) { k = j + 1; while (k <= '9') { write(1, &i, 1); write(1, &j, 1); write(1, &k, 1); // 问题出在此条件语句 if ( ( i != '7' ) && ( j != '8' ) && ( k != '9' ) ) { write(1, ", ", 2); } k++; } j++; } i++; } }
这段代码的目标是输出所有满足i<j<k的数字组合(i、j、k为0-9的字符形式),要求除最后一个组合“789”外,其余所有组合后都打印, 作为分隔符。
错误原因分析
第一个条件语句的逻辑完全偏离需求,核心是误用了逻辑运算规则:
我们需要的逻辑是:只要当前组合不是“789”,就输出分隔符,也就是对“i='7' 且 j='8' 且 k='9'”这个条件取反。
根据逻辑运算的德摩根定律,“不是(A 且 B 且 C)”等价于“非A 或 非B 或 非C”,但第一个条件错误地使用了&&(逻辑与),变成了“非A 且 非B 且 非C”——这意味着只有当i≠7、j≠8、k≠9三个条件同时满足时,才会输出分隔符。
举个实际的错误场景:
- 组合“689”:i=6≠7,但j=8=8,此时
j!='8'为假,整个&&条件不成立,不会输出分隔符,但“689”并不是最后一个组合,后面还有“789”,直接导致格式错误。
而正确的条件if ( !( i == '7' && j == '8' && k == '9' ) )直接对“是789”这个整体条件取反,完全符合需求:只要不是789,就输出分隔符。
内容的提问来源于stack exchange,提问作者yossi-matkal
相关产品推荐
相关产品推荐

