【问题标题】:Expected ‘)’ before ‘;’ token G++ [closed]';' 标记 G++ 之前应为')' [关闭]
【发布时间】:2012-01-31 13:44:10
【问题描述】:

GCC 不断告诉我:

在“;”标记之前应为“)”,
')' 标记之前的预期主表达式
应在“)”标记之前使用“;”

我找不到问题所在。这是有问题的函数:

void prim(){
    prepararEstructuras();
    int min,k;  
    for(int i=1;i<nnodos;i++){
        min = menorCoste[1];
        k = 1;
        for(int j=2;i<nnodos;j++)
            if(menorCoste[j] < min){
                min = menorCoste[j];
                k = j;
            }
        solucion[k][masCercano[k]] = G[k][masCercano[k]];
        menorCoste[k] = infinito;
        for(int j=1;j<nnodos;j++)
            if(G[k][j] < menorCoste[j] && menorCoste[j]!=infinito){
                menorCoste[j] = G[k][j];
                masCercano[j] = k;
            }                   
    }
}

这是导致问题的行:

if(G[k][j] < menorCoste[j] && menorCoste[j]!=infinito){

这是我的变量:

#define MAX_NODOS 20000
#define infinito 10000;

int nnodos;
int nAristas;
int G[MAX_NODOS][MAX_NODOS]; 
int solucion[MAX_NODOS][MAX_NODOS];
int menorCoste[MAX_NODOS];
int masCercano[MAX_NODOS];

【问题讨论】:

  • 这个宏对该行有什么影响? #define infinito 10000;
  • 虽然你所拥有的是有效的,但我强烈建议将那些 {} 放在那些多行 for 循环周围,这样更难阅读,也更容易搞砸。

标签: c++ gcc expression token


【解决方案1】:

您的宏中有一个额外的分号。

#define infinito 10000;
                      ^

摆脱它。

事实上,你的行被扩展成这样:

if(G[k][j] < menorCoste[j] && menorCoste[j]!=10000;){
                                                  ^ does not belong here

或者,根本不使用宏:

const int MAX_NODOS = 20000;
const int infinito = 10000;

【讨论】:

  • 非常感谢您的回答被接受
  • 尽管如此,您确实应该阅读有关预处理器与实际 C 代码的对比 - 以了解为什么如此无辜的额外分号 ****** 您的代码;)
【解决方案2】:

请学习使用良好的风格。在外部语句(例如包含其他语句的语句)中省略括号是一种非常糟糕的风格

但是,您的实际错误在于某些预处理器语句及其生成的代码:#define infinito 10000; 在您不期望这样的附加表达式的表达式之间产生一个额外的分号。尤其是在您根本不需要分号的地方。

【讨论】:

  • 只有更糟糕的风格是给一个叫做 infinito 的东西一个设定值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多