C语言中的“预期表达式”错误

时间:2019-02-14 20:29:32

标签: c syntax expression constants

所以我正在制作这个C程序来根据运输类型来计算成本。您在这里看到的代码只占我实际代码的很小一部分,但是与我实际拥有的代码非常相似(为了方便理解,我不得不将术语改为英语)。

此外,我知道如何用Java正确编码,并且由于C看起来很像Java,所以我想这里的逻辑还可以。因此,我想因为我是C语言新手,所以这里只是缺少一些语法错误。

我在其中输入“期望表达式”的地方是错误所在。

#include <stdio.h>
#include <string.h>
#include <unistd.h>

#define MONTANT_METRO_BUS = 8.00
#define MONTANT_OMNIBUS = 9.00;
#define MONTANT_TRAIN_RAPIDE = 10.00;
#define MONTANT_INTEGRE = 12.00;
#define MONTANT_ORANGE_CARD = 65.00;  

#define CODE_METRO_BUS 'm'
#define CODE_OMNIBUS 'o'
#define CODE_RAPIDE 'r'
#define CODE_INTEGRE 'i'
#define CODE_CARTE_ORANGE 'c'

void lireTransport();

char codeTransport;
double costTransport;

int main {
    lireTransport();
}

void lireTransport() {
    printf("Enter transport code: ");
    scanf("%c",&codeTransport);
    while (codeTransport != CODE_METRO_BUS &&
            codeTransport != CODE_OMNIBUS &&
            codeTransport != CODE_RAPIDE &&
            codeTransport != CODE_INTEGRE &&
            codeTransport != CODE_CARTE_ORANGE){
        printf("Error! Retry: ");
        fflush(stdin);
        scanf("%c",&codeTransport);
    }

    switch (codeTransport) {
        case CODE_METRO_BUS:    costTransport = COST_METRO_BUS;  //Expected expression
                                break;
        case CODE_OMNIBUS:      costTransport = COST_OMNIBUS;  //Expected expression
                                break;
        case CODE_RAPIDE:       costTransport = COST_TRAIN_RAPIDE; //Expected expression
                                break;
        case CODE_INTEGRE:      costTransport = COST_INTEGRE; //Expected expression
                                break;
        case CODE_CARTE_ORANGE: costTransport = MONTANT_ORANGE_CARD; //Expected expression
                                break;
    }
}

但是当我用直接值替换常量时,没有错误发生

switch (codeTransport) {
            case CODE_METRO_BUS:    costTransport = 1.25;
                                    break;
            case CODE_OMNIBUS:      costTransport = 2.50;
                                    break;
            case CODE_RAPIDE:       costTransport = 3.75;
                                    break;
        case CODE_INTEGRE:          costTransport = 4.2;
                                    break;
        case CODE_CARTE_ORANGE:     costTransport = 5.25
                                    break;
    }
}

2 个答案:

答案 0 :(得分:1)

更改

/usr/local/lib/intel/sgxsdk/lib64/

#define MONTANT_TRAIN_RAPIDE = 10.00;


#define MONTANT_TRAIN_RAPIDE 10.00 是预处理器的一部分,是一种在C语言规范之前运行的原始预编译器。预编译器对文本(实际上是令牌)进行操作,并进行简单的替换。

这样做的时候

#define

将来提到的MONTANT_TRAIN_RAPIDE将由#define MONTANT_TRAIN_RAPIDE 10.00 代替。

使用10.00,替换将是#define MONTANT_TRAIN_RAPIDE = 10.00;,这将产生语法上无效的C源代码(您将在编译器期望表达式的地方使用= 10.00;令牌:因此,“预期的表达式”错误。

如果您使用=运行POSIX兼容的编译器,则可以看到预处理结果的文本形式。

即:

-E

将向您显示宏扩展的结果,让您真正看到错误:

gcc -E your_source.c

您去过的地方

costTransport = = 10.00;;

答案 1 :(得分:0)

使用#define创建的宏将直接替换为源代码。它不是分配给它的变量。因此,鉴于此:

#define MONTANT_OMNIBUS = 9.00;

然后这个:

case CODE_OMNIBUS:      costTransport = COST_OMNIBUS;  //Expected expression

成为:

case = 9.00;:      costTransport = = 9.00;;  //Expected expression

摆脱=;的局限,使该符号仅被替换为值:

#define MONTANT_OMNIBUS 9.00