【问题标题】:C prog error: expected expression before intC 程序错误:int 之前的预期表达式
【发布时间】:2014-08-19 21:08:57
【问题描述】:

这是程序:

#include <stdio.h>
#define round(a) ((a-0.5)<int(a))?int(a):int(a+1)
int main() {
double a = 5.2;
int m = round(a);
printf("%d", m); }

它显示错误:'int'之前的预期表达式

【问题讨论】:

  • (int)(a),不是int(a)
  • return 0;放在最后也不错。
  • @TheDubleM:是的。更好的是#include &lt;stdlib.h&gt;,使用return EXIT_SUCCESS;,比“0”更清晰。

标签: c compiler-errors


【解决方案1】:

round 是标准 C 库保留的名称,因此调用该名称的宏是未定义的行为(即使您不包括 math.h)。

你的算法可以这样更好地表达:

#define my_round(a)  ( (int)((a) + 0.5) )

它还有一个好处是只评估它的参数一次。

最好使用内联函数:

inline int my_round(double d)
{
    return d + 0.5;    
}

请注意,如果aINT_MININT_MAX 的范围之外,这两个选项都会导致未定义的行为。如果它处于关键环境中,您应该让您的内联函数在转换为 int 之前检查 d 的边界。

【讨论】:

  • 对于 2^52 和 2^53 之间的浮点数,问题中的原始宏​​会产生错误的结果(对于名称“round”中隐含的规范)。您的版本对 2^52 和 2^53 之间的奇数浮点数以及 0.5 的前身产生错误的结果。
【解决方案2】:

这个

#define round(a) ((a-0.5)<int(a))?int(a):int(a+1)

括号在错误的地方

应该是

#define round(a) (((int)((a)-0.5))<(a))?(int)(a):(int)(a+1)

【讨论】:

  • 比较时需要投(a),否则永远为真。
【解决方案3】:

问题是int(a) 不是有效的C。

重新定义你的宏如下:

#define round(a) (((a)-0.5)<(int)(a))?(int)(a):(int)(a+1)

请注意,我还在(a)-0.5 中的a 周围添加了括号。

附:将其设为宏而不是函数的原因是什么?

【讨论】:

    【解决方案4】:

    错误是因为int(a)Syntactically 错了。应该是(int)(a)

    【讨论】:

      猜你喜欢
      • 2014-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-22
      相关资源
      最近更新 更多