#include <stdio.h>
int quotient(int *q, int *p)
{
if(*p) return *q/*p /* compute ratio */ ;
else return *q;
}
int main()
{
int n = 20, m = 4;
int q = quotient( &n, &m );
printf( "%d/%d == %d\n", n, m, q );
return 0;
}问题分析:
代码 return *q/*p /* compute ratio */ ; 中,注释符号 /* 与除法运算符 / 和指针解引用 * 的组合导致了问题。
实际执行:
- 编译器将
*q/*p解析为*q / *p(两个指针解引用的除法) - 但是
/*被识别为注释开始符号 - 因此
*q/*p实际上变成了*q,后面的/*p /* compute ratio */被当作注释忽略了
正确的写法:
// 方法1:在除号和注释之间加空格
if(*p) return *q / *p; // compute ratio
// 方法2:使用单行注释
if(*p) return *q / *p; // compute ratio
// 方法3:使用括号明确分隔
if(*p) return (*q) / (*p); /* compute ratio */要点:
- 注释语法:
/* */是块注释,//是行注释 - 词法分析:编译器在词法分析阶段识别注释,可能影响代码解析
- 最佳实践:在运算符和注释之间使用空格,或使用单行注释
- 代码可读性:清晰的代码布局可以避免这类问题