C “;”之前的语法错误代币

C “;”之前的语法错误代币,c,syntax-error,C,Syntax Error,我写了一个快速计算工资的程序来帮助我跟上进度。由于某种原因,当我编译这个时,我不断得到错误53:在“;”之前的语法错误代币 包括 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=m

我写了一个快速计算工资的程序来帮助我跟上进度。由于某种原因,当我编译这个时,我不断得到错误53:在“;”之前的语法错误代币

包括

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;
}

不管我读了多少遍,我都看不出我做错了什么

顺便说一下,如果有人想对我的风格大喊大叫/指点一下,那就去吧,因为我很欣赏任何能提高我技能的建议

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

if (month=='A'||'C'||'E'||'G'||'H'||'J'||'L'){
    ... 
}
这种方式月份=='A'| | | | | | | | | | | | | | | | | | | | | | |你比较了错误的值,即| | | | | | | | | | |

试试这个

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

然而,正如@danfuzz所提到的,问题似乎在别处…

一个错误,虽然不是一个立即抓住你的错误,但似乎是这一行:

exit 1;
在C语言中,exit是一个常规函数,因此您必须这样调用它:

exit(1);

正如其他人所指出的,您对| |的使用也是不正确的,尽管这可能会给您一些警告,如果有任何错误的话。

您的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;
}
现在您编辑了另一个错误,即定义年份365;
去掉那个“;”。您可能更喜欢将其定义为int,而不是使用预编译器define,特别是如果您要更改其值,那么代码中会出现许多灾难性的问题,但是除了exit 1位之外,大多数问题都是可以正式编译的。他们只是没有做你认为他们在做的事

但是,您声明在退出1行之前就出现了编译错误。如果是这样的话,那一定是因为你没有向我们展示的东西,因为没有;第53行。我猜那一年被定义为一个包含;的宏

编辑:您在评论中说您已将年份定义为365。我怀疑是你干的

#define year 365;
这就是导致错误的原因。摆脱它;365之后。然而,如果是这样的话,我仍然不明白为什么你会将你的年份与365或366进行比较,如果你已经将它定义为365

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

if((month=='B')&&(year==365)){
被翻译成

if((month=='B')&&(365;==365)){
这就是导致原始错误的原因。如果要将年份定义为代表365的宏常量,则应为

#define year 365

同样的情况也适用于week,尽管您没有在代码中的任何地方使用它。

ifmonth=='A'| | | | C'| | | | E'| | G'| | | H'| | J'| | L'{你不能这么做。如果month='A'| | month='B'| |…没有;像53一样的标记。一定有什么东西你没有给我们看。你有没有把年份定义为一个宏???首先,退出1而不是退出1哇,太快了,我添加了额外的's,因为忽略了这么简单的事情,我感觉自己像个十足的白痴,但我仍然得到了答案由于某种原因出现错误。@AndreyT是的,我已将年份定义为365。关于调用exit的语法,您是正确的,但根据OP,编译器抛出的错误比这段代码早得多。