【问题标题】:'Expected expression' errors [closed]“预期的表达”错误[关闭]
【发布时间】:2013-12-26 19:27:39
【问题描述】:

以下代码出现预期表达式错误:

 (void) for(t; t < kPlatformsStartTag + kNumPlatforms; t++) { //error here
 CCSprite *platform = (CCSprite*)[batchNode getChildByTag:t];

CGSize platform_size = platform.contentSize;
CGPoint platform_pos = platform.position;

max_x = platform_pos.x - platform_size.width/2 - 10;
min_x = platform_pos.x + platform_size.width/2 + 10;
float min_y = platform_pos.y + (platform_size.height+bird_size.height)/2 - kPlatformTopPadding;

if(bird_pos.x > max_x &&
   bird_pos.x < min_x &&
   bird_pos.y > platform_pos.y &&
   bird_pos.y < min_y) {
    [self jump];
    }
}

 (void) for(t; t < kCloudsStartTag + kNumClouds; t++) { //error here
CCSprite *cloud = (CCSprite*)[batchNode getChildByTag:t];
CGPoint pos = cloud.position;
pos.y -= delta * cloud.scaleY * 0.8f;
if(pos.y < -cloud.contentSize.height/2) {
currentCloudTag = t;
     [self resetCloud];
} else {
    cloud.position = pos;
    }
}

错误出现在“for”代码所在的位置。我将(无效)代码放入,因为我会得到一个表达式结果未使用的错误。有什么想法吗?

【问题讨论】:

  • 生成的错误究竟是什么?以及在for 之前没有void 的错误?
  • 这与 Xcode 无关。
  • 另外,学习 C 的基础知识(可能使用书籍或教程)。您必须了解该语言的基本要素,我们不是来用勺子喂给您的。
  • @H2CO3 - 感谢您的建议,但对我的问题没有帮助。我在 xcode 引擎上使用 Objective-C。
  • @rullof - 我得到的没有 void 的错误是未使用的实体问题 - 表达式结果未使用。我从这个页面得到了 void 解决方案:stackoverflow.com/questions/7914990/…

标签: objective-c compiler-errors


【解决方案1】:

for 循环之前的 (void) 没有意义。

【讨论】:

【解决方案2】:

您必须在for 循环之前删除(void),因为它不是有效的c 语法。你不能用另一个错误来解决一个错误。

您可能会问:为什么将(void) 放在for 循环之前会防止未使用的表达式错误。那是因为调试器没有到达它。它不知道for 是什么,因为他期望它的结果值将其转换为void

当编译器产生错误时:Unused Entity Issue - Expression result unused。这意味着您的程序正在评估一个表达式而不使用它。

在您的for 循环中,如果t 变量已经按照您的需要进行了初始化,您不应将其放在第一部分,因为它将被视为未使用的表达式。

for(; t < kPlatformsStartTag + kNumPlatforms; t++) { // keep the first expresion empty
    // ...
}

【讨论】:

  • 我认为,user2984757 不是因为未使用变量而在谈论警告,而是因为未使用表达式的结果(例如调用返回 int 而不使用其结果的函数)。在我看来,这无论如何都是一个无用的警告,因为在 C 中,几乎每个表达式都包含一个仅针对其副作用进行评估的表达式(例如,x=y; 有一个未使用的结果,而编写 (void)(x=y) 是愚蠢的),忽略非空表达式的结果通常没有什么问题。
  • @mafso Tanks 我只是错过了它,因为他没有解决问题。
【解决方案3】:

您已经得到了关于虚假 (void) 的答案,但没有得到关于未使用表达式的答案。

for(t; t < kCloudsStartTag + kNumClouds; t++)

这里的初始表达式t 完全没有效果,因此根本没有业务存在。 t 的值被读取并立即丢弃,任何体面的编译器都会优化它,甚至不费心去读取t。这里不需要表达式。你可以删除它,然后写

for(; t < kCloudsStartTag + kNumClouds; t++)

虽然就个人而言,我可能会倾向于使用 while 循环。

编辑:仔细阅读你的代码,你的代码似乎需要给t一个初始值。

for(t = 0; t < kCloudsStartTag + kNumClouds; t++)

不管怎样,你试图在不了解警告告诉你什么的情况下隐藏警告并不是一个好主意。

【讨论】:

  • 谢谢,成功了。
猜你喜欢
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多