4.9 常见编程错误
C语言的关系运算符和判等运算符用1表示true,0表示false的事实意味着C语言会以一种初看起来令人惊奇的方式解释某些常见的数学表达式。你可能没有预料到下面的if语句对x的任何值都显示Condition is true。
if (0 <= x <= 4)
printf ("Condition is true\n");
例如,考虑x为5的情况。0 <= 5的值为1,而1当然小于等于4!要检查x是否在0到4的范围内,应该使用下面的条件:
(0 <= x && x <= 4)
记住C语言的判等运算符是==。如果不小心使用了=(数学上的等号),编译器只在第一个操作数不是变量时才能检测出这个错误;否则,你的代码只会产生一个不正确的结果。例如,无论x的值是什么,以下的代码片段总是打印x is 10。
if ( x = 10)
Printf ("x is 10");
赋值运算符将10存储在变量x中。赋值表达式的值是被赋予的值,因此在这种情况下,该语句的if条件的值是10。由于10是非零的值,C语言将它看作true并执行条件为true时的任务。
不要忘了给if语句的条件加上括号,将单选项if作为双选项if的条件为true时的任务时也不要忘了将它放到大括号内。大括号会强制else和正确的if关联。作为条件为true或false时的任务的复合语句也要放到大括号中。如果丢掉了大括号,只有第一条语句会被当作条件为true或false时的任务。如果复合语句作为双选项if的条件为true时的任务,丢失大括号会导致语法错误。双选项if条件为false时的任务的大括号丢失或者单选项if条件为true时的任务的大括号丢失通常不会产生语法错误,只会导致不正确的结果。在下面的例子中,条件为true时的任务的大括号丢失,编译器认为赋值语句结尾的分号终止了if语句。
if(x > 0)
sum = sum + x;
printf("Greater than zero\n");
else
printf("Less than or equal to zero\n");
当到达保留字else时,编译器会产生语法错误unexpected symbol。
在编写嵌套if语句时,尝试对条件进行选择以便使用4.7节给出的多选项格式。只要可能,就应该对逻辑进行构建使得每一个中间条件落在前一个决策的false分支上。如果同一时刻可能有不止一个条件为true,将最严格的条件放在最前面。
记住C编译器将else和最近一个未匹配的if进行匹配。如果不小心,可能会得到和预期不一样的配对。这可能不会导致语法错误,但是会影响结果。
在switch语句中,确保控制表达式和case标签是相同的允许类型(int或者char但不能是double)。记住包含一个default标签,否则当控制表达式的值没有在任何一个case标签中列出时,整个switch语句会被跳过。
不要忘了switch语句体是包含在一对大括号中的单个复合语句。但是,switch中每一个选项的语句不放在大括号中,而是由break语句结束每个选项。如果忽略了break语句,程序会“贯穿”并执行下一个case的语句。







