所以我正在制作这个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;
}
}
更改
#define MONTANT_TRAIN_RAPIDE = 10.00;
至
#define MONTANT_TRAIN_RAPIDE 10.00
等等
#define
是预处理器的一部分,它是一种在C本身之前运行的原始预编译器。预编译器对文本(真实的令牌)进行操作并进行简单的替换。
当你这样做
#define MONTANT_TRAIN_RAPIDE 10.00
将来提到的MONTANT_TRAIN_RAPIDE将被10.00
取代。
使用#define MONTANT_TRAIN_RAPIDE = 10.00;
,替换将是= 10.00;
,这将产生语法上无效的C源(你有=
令牌,编译器会期望一个表达式:因此“表达式预期”错误)。
如果使用-E
运行它们,POSIX兼容的编译器将允许您查看预处理结果的文本形式。
即:
gcc -E your_source.c
将向您展示宏扩展的结果,让您真正看到错误:
costTransport = = 10.00;;
你在哪里
costTransport = COST_TRAIN_RAPIDE;
等等
使用#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