错误:在C中将float或double转换为整数时,在'int'之前的预期表达式

时间:2016-12-21 06:32:40

标签: c gcc compiler-errors

此代码用于显示介于500和1000之间的引物号。

当我在gcc 6.2.1上构建此代码时,它会返回错误,但是当我在Visual Studio 2015上构建它时,它就会成功。

    #include <stdio.h>
    #include <math.h>
    int primer_number(int a)
    {
      int i, m = 0;
      for (i = 2; i<int(sqrt(double(a))); i++)
      {
        if (a%i == 0) return m = 1;
      }
    return m;
    }

   int main(void)
   {
    int i;
    for (i = 500; i <= 1000; i++)
    {
        if (primer_number(i) == 0) printf("%d\n", i);
    }
   }

屏幕截图gcc 6.2.1

x=3.14159265359;
float y=1.41421;
int z=int(x);
z=int(y);

您的错误消息:

cfile.c:605:10: error: expected expression before ‘int’
    int z=int(x);
          ^~~
cfile.c:606:6: error: expected expression before ‘int’
    z=int(y);
      ^~~

1 个答案:

答案 0 :(得分:2)

int(sqrt(double(a)))是C ++中的有效表达式,但不是C中的有效表达式。也许Visual Studio 2015有一些非标准扩展,允许在C中使用这样的表达式,或者您正在编译文件,就像它是C ++文件一样。

double x=3.14159265359;
float y=1.41421;
int z=(int)x;  //correct syntax to cast double to int
z=(int)y;  // there should be no syntax error 

将其更改为(int)sqrt(a)

for (i = 2; i< (int)sqrt(a)); i++)
{
  if (a%i == 0) return m = 1;
}

<击> 进一步清理的建议

通过将调用移至sqrt(a),您可以获得更好的性能。此外,您根本不需要变量m

int primer_number(int a)
{
   int i;
   int end = (int)sqrt(a);
   for (i = 2; i < end; i++)
   {
     if (a%i == 0) return 1;
   }

   return 0;
}

<击>

PS 函数中使用的逻辑错误。您可以使用略微修改的逻辑:

int primer_number(int a)
{
   int i;
   for (i = 2; i*i <= a; i++)
   {
      if (a%i == 0) return 1;
   }
   return 0;
}