C语言编译报错:expected identifier,使用逻辑非(!)符号引发编译错误
C语言if语句编译错误:
expected identifier的原因分析 问题重现
你编写的C语言函数代码:
int find_min(void) { mini=voter_count; for(int i=0; i>candidate_count; i++) { if (candidates[i].votes<mini) && !(candidates[i].eliminated){ mini = candidates[i].votes; } } return mini; }
编译时出现错误:
runoff.c:187:42: error: expected identifier
if (candidates[i].votes<mini) && !(candidates[i].eliminated)){
^**
错误核心原因
这个错误的根源是if语句的条件表达式括号使用不符合C语言语法规则:
在C语言中,if的整个条件表达式必须被**一对完整的圆括号()**包裹起来。你把逻辑与运算符&&和后半部分条件放在了第一个括号外面,导致编译器无法识别这个语法结构——它不知道括号外的&&属于哪个语句,因此抛出了expected identifier的错误。
至于你提到移除!后能编译,那是因为此时代码变成了if (candidates[i].votes<mini) && (candidates[i].eliminated),编译器会把(candidates[i].votes<mini)当作if的条件,后面的&& (candidates[i].eliminated)被视为一个独立的无意义表达式(逻辑上完全错误,但语法暂时通过),这并不是正确的写法。
修正后的代码
除了修复if的括号问题,还需要纠正两个潜在的错误(变量未声明、循环条件错误):
int find_min(void) { int mini = voter_count; // 补充变量类型声明 for(int i=0; i < candidate_count; i++) { // 修正循环条件为i < candidate_count if ((candidates[i].votes < mini) && !(candidates[i].eliminated)) { mini = candidates[i].votes; } } return mini; }
额外注意点
- 变量声明问题:原代码中
mini没有声明类型,C语言要求变量必须先声明再使用,缺失类型会导致编译错误。 - 循环逻辑错误:原循环条件
i>candidate_count会导致循环体完全不执行(初始i=0,若candidate_count为正数,条件永远不成立),必须改为i < candidate_count才能遍历所有候选人。
内容的提问来源于stack exchange,提问作者Omkar
相关产品推荐
相关产品推荐

