C函数中未声明的标识符
当我编译以下C函数/程序时,我得到的错误如"missing ';' before 'type' 'remainder' : undeclared identifier"
"missing ';' before 'type' 'remainder' : undeclared identifier"
– 这个函数有什么问题?
#include void conversionTo(int number,int base) { if(number==0) return; int remainder=number%base; conversionTo((number/base),base); if(remainder<10) printf("%c",'0'+remainder); else printf("%c",'a'-10+remainder); } int main() { conversionTo(int number,int base); return 0; }
我不是C专家,但从很久以前的经验来看,我相信你不能在函数中间声明变量。
此外,还不清楚您正在尝试使用函数/打印语句。
试试这个:
#include void conversionTo(int number,int base) { int remainder=number%base; if(number==0) return; conversionTo((number/base),base); if(remainder<10) printf("%c",'0'+ remainder); // Through the way ASCII works that gives the ASCII rep // of the remainder. else printf("%c",'a'-10+remainder); // Hex digits (AF). } int main() { conversionTo(/*Any number here*/10, /*any base number here*/2); return 0; }
您需要定义变量,然后才能使用它们。 所以这:
int main() { conversionTo(int number,int base); return 0; }
应该成为这样的:
int main(void) { int number; int base: number = 47; base = 11; conversionTo(number, base); return 0; }
非C99兼容编译器也不喜欢在上下文中间声明变量:
void conversionTo(int number,int base) { if(number==0) return; int remainder=number%base; /* this would fail. */ conversionTo((number/base),base);
为了解决这个问题,打开另一个环境
void conversionTo(int number,int base) { if(number==0) return; { int remainder=number%base; conversionTo((number/base),base); if(remainder<10) printf("%c",'0'+remainder); else printf("%c",'a'-10+remainder); } }
您必须使用值或变量调用函数,而不是声明:
conversionTo(123, 10); // using constant value
要么
int number = 123, base = 10; // variable declaration conversionTo(number, base); // using variable
你正在调用你的函数错误 – 以这种方式传递参数:
conversionTo(2,2); // assuming you want to convert 2 to binary
要么
int number = 123, base = 10; conversionTo(number, base); // note this is not the same number and base as in the definition of your conversionTo function
完整代码:
#include void conversionTo(int number,int base) { if(number==0) return; int remainder=number%base; conversionTo((number/base),base); if(remainder<10) printf("%c",'0'+remainder); else printf("%c",'a'-10+remainder); } int main() { conversionTo(2,2); // assuming you want to convert 2 to binary return 0; }
使用函数时有3件事:
函数声明/原型 - 函数的原型是:
void conversionTo(int ,int );
function定义:
void conversionTo(int number,int base /* Parameter list*/) { // your functionality }
将函数传递给函数的函数调用:
conversionTo(2,2);
语句conversionTo(int number,int base);
只需重新声明它。 尝试这个,即使这将编译:
int main() { printf("Hello World"); int main(); }
conversionTo(int number, int base)
是声明函数可以采用哪些参数的语法。 要实际调用该函数,您需要省略该类型(假设您有相应名称的变量)
int number = 5; int base = 10; conversionTo(number, base); // <-- no int here!
或者您可以直接使用数字:
conversionTo(5, 10);
函数声明中的函数定义number
和base
void conversionTo(int number, int base)
是传递给它的值在函数内部的名称。 因此,如果您调用conversionTo(2,5)
,则会在函数内部看到2作为number
,而5将被视为base
。
如果你想使用变量而不是内容来调用函数,你可以这样做:
int main() { int base = 2; int number = 5; conversionTo(base, number); return 0; }
在这个令人困惑的例子中,变量base
和value
具有值2和5。 但是当你将它们传递给函数时,它内部的值将是number = 2和base = 5.这表明这些变量实际上是不同的,尽管它们具有相同的名称。
您应该使用$ CC -std = c99进行编译,以便在块中间声明变量。
(参见规范中的6.8节)
声明“int remainder”必须在块中的任何语句之前。 声明可能有一个初始化器,就像你在这里一样。
你可以这样做:
void conversionTo(int number,int base) { if (number > 0) { int remainder... } }
因为该function不适用于负数。
修复例程中的其他错误:
void conversionTo(int number,int base) { if(number>=0&&base>0&&base<=36) { int remainder=number%base; number/=base; if(number>0)conversionTo(number,base); printf("%c",(remainder<10)?'0'+remainder:'a'+remainder-10); } }
如果数字为零,则将打印0,并且仅在需要时递归。