使用getchar()出现'initializer element is not constant'错误的咨询
问题解决:C语言全局变量初始化与代码位置错误
原代码
#include <stdio.h> #include <stdbool.h> typedef enum{ counting1, counting2, searching, possiblecom, possibleend, } read_state; bool issep(char a){ return (a == ' ' || a == '\n' || a == '\t'); } read_state state = searching; int count = 0; int c = getchar(); // 错误点1:全局变量用函数调用初始化 bool wasword = false; // 错误点2:while循环直接放在全局作用域,不是函数内 while (c != -1) { if(state == searching) { if(c == '{'){state = counting1;} else if(c == '('){state = possiblecom;} }else { if(state == counting2 && c == '*'){ c = getchar(); if(c == ')'){ state = searching; if(wasword = true){ count++; } }else{ if (issep(c)){ if (wasword == true){count++;} wasword = false; }else{wasword = true;} } } else if(state = counting1 && c == '}'){state = searching;} else if (state == counting1 || state == counting2){ if (issep(c) == false){ wasword = true; } else{ if(wasword == true){count++;} wasword = false; } } } c = getchar(); if(state = possiblecom){ if(c == '*'){ state = counting2; c = getchar(); wasword = false; }else{state = searching;} } } // 错误点3:printf直接放在全局作用域,不是函数内 printf("%d", count);
报错信息
1: comcount.c:24:9: error: initializer element is not constant 24 | int c = getchar(); | ^~~~~~~ 2: comcount.c:28:1: error: expected identifier or ‘(’ before ‘while’ 28 | while (c != -1) | ^~~~~ 3:comcount.c:84:8: error: expected declaration specifiers or ‘...’ before string constant 84 | printf("%d", count); | ^~~~ comcount.c:84:14: error: expected declaration specifiers or ‘...’ before ‘count’ 84 | printf("%d", count); | ^~~~~
错误原因分析
全局变量初始化规则限制:全局变量的存储空间在程序启动阶段就分配完成,初始化值必须是编译期就能确定的常量。
getchar()是运行时执行的函数调用,返回值只有程序运行时才能确定,因此不能用来初始化全局变量c。你之前能正常运行int c = getchar();,是因为那段代码写在函数内部(比如main函数里),局部变量允许使用运行时表达式初始化。代码逻辑不能直接置于全局作用域:C语言规定,函数外部的全局作用域只能存放变量声明、函数声明或预处理指令,不能直接编写while循环、printf这类执行语句。你的while循环和printf直接放在全局作用域,编译器会将其当作声明解析,因此报错。
修复方案
将所有执行逻辑(while循环、getchar调用、printf)放入main函数内部,全局变量可保留声明(也可改为局部变量)。修复后的代码如下:
#include <stdio.h> #include <stdbool.h> typedef enum{ counting1, counting2, searching, possiblecom, possibleend, } read_state; bool issep(char a){ return (a == ' ' || a == '\n' || a == '\t'); } int main() { read_state state = searching; int count = 0; int c = getchar(); // 局部变量可使用getchar()初始化 bool wasword = false; while (c != -1) { if(state == searching) { if(c == '{'){state = counting1;} else if(c == '('){state = possiblecom;} }else { if(state == counting2 && c == '*'){ c = getchar(); if(c == ')'){ state = searching; if(wasword){ // 简化判断,替换原错误的赋值操作 count++; } }else{ if (issep(c)){ if (wasword){count++;} wasword = false; }else{wasword = true;} } } else if(state == counting1 && c == '}'){state = searching;} // 修正为相等判断,替换原赋值操作 else if (state == counting1 || state == counting2){ if (!issep(c)){ wasword = true; } else{ if(wasword){count++;} wasword = false; } } } c = getchar(); if(state == possiblecom){ // 修正为相等判断,替换原赋值操作 if(c == '*'){ state = counting2; c = getchar(); wasword = false; }else{state = searching;} } } printf("%d", count); return 0; }
额外注意:原代码存在多处逻辑错误,把判断相等的==写成了赋值操作=(比如else if(state = counting1 && c == '}')),这些会导致程序逻辑偏离预期,已在修复代码中修正。
内容的提问来源于stack exchange,提问作者OctoPussy
相关产品推荐
相关产品推荐

