【问题标题】:syntax error before ';' token';' 之前的语法错误令牌
【发布时间】:2013-11-26 21:50:59
【问题描述】:

我编写了一个快速程序(计算工资)来帮助我跟上进度。由于某种原因,当我编译它时,我不断收到错误“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;

}

无论我阅读多少次,我都无法看到我做错了什么。

作为旁注,如果有人想对我的风格大喊大叫/给予指点,请继续,因为我感谢任何可以提高我技能的提示。

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

【问题讨论】:

  • if(month=='A'||'C'||'E'||'G'||'H'||'J'||'L'){ 你不能那样做。
  • if((month=='A')||(month=='B')||...)
  • 在 53 上没有 ; 令牌。一定有一些你没有向我们展示的东西。你有没有把year定义为宏???
  • 首先,exit(1) 而不是 exit 1
  • 哇,这很快,我添加了额外的 () 并且几乎感觉像一个完整的白痴,因为忽略了如此简单的事情,但由于某种原因我仍然收到错误。 @AndreyT 是的,我已将年份定义为 365。

标签: c syntax-error


【解决方案1】:

一个错误(虽然不是立即让你知道的那个,似乎)是这一行:

exit 1;

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

exit(1);

正如其他人指出的那样,您对 || 的使用也是不正确的,尽管这可能会给您警告(如果有的话)而不是错误。

【讨论】:

  • 您对调用exit 的语法是正确的,但是根据OP,编译器比这段代码更早地抛出错误。
【解决方案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 所提到的,问题似乎出在其他地方......

【讨论】:

    【解决方案3】:

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

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

    编辑:在 cmets 中您说您已将 year 定义为 365。我怀疑你这样做了

    #define year 365;
    

    这就是导致错误的原因。在365 之后摆脱;。但是,如果是这种情况,我仍然不明白为什么要将 year365366 进行比较,如果您已经将其专门定义为 365

    编辑: 所以,这和我猜的一模一样。对于清单常量,您不需要在 #define 语句之后的那些 ;。这是你的错误。宏被替换为文本替换,这意味着当前您的

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

    被翻译成

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

    这是导致原始错误的原因。如果要将year定义为代表365的宏常量,应该是

    #define year 365
    

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

    【讨论】:

      【解决方案4】:

      你的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 而不是使用预编译器定义,尤其是如果您要更改其值

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-12
        • 2016-06-19
        相关资源
        最近更新 更多