';'之前的语法错误代币

时间:2013-11-26 21:51:00

标签: c syntax-error

我写了一个快速程序(计算工资)来帮助我保持速度。出于某些原因,当我编译它时,我不断收到错误“53:'之前的语法错误';'标记“

#include

int main()
{
#define week 7;
#define year 365;
int jan,feb,mar,apr,may,june,july,aug,sep,oct,nov,dec;
int wage;   /* Upgrade to float in future */
char input,month;

int holder;

jan=mar=may=july=aug=oct=dec=31;
apr=june=sep=nov=30;
feb=28;

for(;;)
{
    if(input='y')
    {
        #define YEAR 366;
        break;
    }
    else if(input='n')
    {
        break;
    }
    else
    {
        printf("Unable to understand input");
    }
}

printf("Enter wage/day in pounds.\n?\n");
scanf("%d",&wage);      /* unsure if I need to get string and then use atoi */
printf("Wage per day:\t%d\n",wage);
printf("Wage per week:\t%d\n",wage*7);
printf("Wage per month:\t%d\n",wage*30);

holder=YEAR;
printf("Wage per year:\t%d\n",wage*holder);
printf("As months have varying day amounts, if you wish to view a specific month type:\n");
printf("A-Jan\nB-Feb\nC-Mar\nD-Apr\nE-May\nF-June\nG-July\nH-Aug\nI-Sep\nJ-Oct\nK-Nov\nL-Dec\nor type X-to EXIT");

month=getchar();

if((month=='A')||(month=='C')||(month=='E')||(month=='G')||(month=='H')||(month=='J')||(month=='L')){
    printf("Wage for this month will be:\t%d",wage*31);
}
else if((month=='D')||(month=='F')||(month=='I')||(month=='K')){
    printf("Wage for this month will be:\t%d",wage*30);
}
else if((month=='B')&&(year==365)){
    printf("Wage for this month will be:\t%d",wage*28);
}
else if((month=='B')&&(year==366)){
    printf("Wage for this month will be:\t%d",wage*29);
}
else if(month=='X'){
    exit(1);
}
return 0;

}

int main() { #define week 7; #define year 365; int jan,feb,mar,apr,may,june,july,aug,sep,oct,nov,dec; int wage; /* Upgrade to float in future */ char input,month; int holder; jan=mar=may=july=aug=oct=dec=31; apr=june=sep=nov=30; feb=28; for(;;) { if(input='y') { #define YEAR 366; break; } else if(input='n') { break; } else { printf("Unable to understand input"); } } printf("Enter wage/day in pounds.\n?\n"); scanf("%d",&wage); /* unsure if I need to get string and then use atoi */ printf("Wage per day:\t%d\n",wage); printf("Wage per week:\t%d\n",wage*7); printf("Wage per month:\t%d\n",wage*30); holder=YEAR; printf("Wage per year:\t%d\n",wage*holder); printf("As months have varying day amounts, if you wish to view a specific month type:\n"); printf("A-Jan\nB-Feb\nC-Mar\nD-Apr\nE-May\nF-June\nG-July\nH-Aug\nI-Sep\nJ-Oct\nK-Nov\nL-Dec\nor type X-to EXIT"); month=getchar(); if((month=='A')||(month=='C')||(month=='E')||(month=='G')||(month=='H')||(month=='J')||(month=='L')){ printf("Wage for this month will be:\t%d",wage*31); } else if((month=='D')||(month=='F')||(month=='I')||(month=='K')){ printf("Wage for this month will be:\t%d",wage*30); } else if((month=='B')&&(year==365)){ printf("Wage for this month will be:\t%d",wage*28); } else if((month=='B')&&(year==366)){ printf("Wage for this month will be:\t%d",wage*29); } else if(month=='X'){ exit(1); } return 0; 无论我读了多少次,我都无法看到我做错了什么。

作为旁注,如果有人感到尖叫/指示我的风格,请继续,因为我感谢任何可以提高我的技能的提示。

谢谢大家,这是一个非常快速的响应,我已经正确编译了代码,所以现在我可以开始调试运行时错误(在任何人提到它之前。是的,我确实理解输入后需要刷新)

4 个答案:

答案 0 :(得分:4)

这一行出现了一个错误(虽然不是那个立即得到你的错误):

exit 1;

在C中,exit是一个常规函数,所以你必须像这样调用它:

exit(1);

正如其他人所指出的,你对||的使用也是不正确的,虽然这可能会给你警告(如果有的话)而不是错误。

答案 1 :(得分:2)

你做不到

if (month=='A'||'C'||'E'||'G'||'H'||'J'||'L'){
    ... 
}

这种方式month=='A'||'C'||'E'||'G'||'H'||'J'||'L'您正在比较错误的值,即<bool> || <char> || <char> ||...,这会为您提供无效的语法。

试试这个,

if (month=='A' ||
    month=='C' ||
    month=='E' || 
    month=='G' ||
    month=='H' ||
    month=='J' ||
    month=='L') {
    ... 
}

然而,正如@danfuzz所说,这个问题似乎在其他地方......

答案 2 :(得分:2)

您的代码存在许多灾难性问题,但大多数问题(除了exit 1位)都可以正式编译。他们只是没有做你认为他们正在做的事情。

但是,您声明在exit 1行之前收到编译错误。如果是这种情况,那么它必定是由你没有向我们展示的东西引起的,因为第53行没有;。我的猜测是year被定义为包含{的{ {1}}。

编辑:在评论中,您说您已将;定义为year。我怀疑你做到了这个

365

这就是造成错误的原因。在#define year 365; 之后摆脱;。但是,如果是这种情况,我仍然不明白为什么你要将365year365进行比较,如果你已经明确地将它366定义的话。

编辑:所以,正如我猜测的那样。在清单常量的365语句之后,您不需要那些;。这是你的错误。宏被替换为文本替换,意味着目前是

#define

被翻译成

if((month=='B')&&(year==365)){

这是导致原始错误的原因。如果您想将if((month=='B')&&(365;==365)){ 定义为代表year的宏常量,那么它应该是

365

同样适用于#define year 365 ,但您并未在代码中的任何位置使用它。

答案 3 :(得分:0)

你的sintax是错的,正确的写法是:

if((month=='A')||(month=='C')||(month=='E')||(month=='G')||(month=='H')||(month=='J')||(month=='L')){
printf("Wage for this month will be:\t%d",wage*31);
}

等等。但您可能需要考虑可能更容易阅读的开关。

switch( month ) {
   case 'A':
   case 'C':
   case 'E':
   case 'G':
   case 'H':
     printf( "statement A\n");
     break;
   case 'K':
   case 'D':
   case 'F':
     printf( "statement B\n");
      break;
   case 'B':
     if( year == 365) {
       printf( "something else\n" );
     } else if( year == 366 ) {
       printf( "something else\n" );
     } else {
       printf( "Unexpected year %d\n", year );
     }
     break;
   case 'X':
     return -1; /* Note here return... not exit! */
   default:
      printf( "Why am I here?\n" );
      break;
}

现在您编辑了另一个错误#define YEAR 365; 摆脱那个';'。您可能更喜欢将其定义为int而不是使用预编译器定义,尤其是如果要更改其值