处理项目Euler问题(#10),我有一个有趣的编译错误。我的编译器告诉我需要一个分号。确切的错误是49: ';' expected
。
现在我知道这对C代码来说并不罕见,但问题是我检查了所有分号,括号和括号,并且没有遗漏任何分号。甚至不在循环中。我可能只是错过了它。
无论其
编译器告诉我49: ';' expected
- 但第49行的代码只是一个括号({
)。
有人会对这里可能出现的问题有所了解吗?
代码如下:
// this is a program to find the sum of all primes below 2 million
// uses the Seive of Eratosthenes
#include <stdio.h>
int main() {
long int sum = 0;
long int s = 2000000; // size of array
long int i; // 'for' loops
long int n; // number to test
long int a; // prime checker
long int multiples;
long int* array; // define pointer for calloc int array
// calloc the array
array = (int*)calloc(s, sizeof(int)); // allocates 2,000,000 spots (s) of
// size "int" to array "array"
// set all array values equal to 1
for (i = 0; i < 2000000; i++) {
array[i] = 1;
}
/*
VALUES IN ARRAY
The values of the array indicates whether number-
(0) IS PRIME
(1) UNTESTED
(2) IS COMPOSITE
*/
// implement prime finder
for (n = 0; n < 2000000; n++) {
if (array[n] == 0) // IF n IS PRIME
{
multiples = n;
multiples += n;
while (multiples < 2000000) {
array[multiples] = 2;
multiples += n;
}
} else
(array[n] == 2) // IF n IS COMPOSITE (is a multiple)
{ // THIS IS LINE 49
continue;
}
else(array[n] == 1) // UNTESTED
{
for (a = 2; a < n; a++) // double checks for composites
{
// tests factors
if (n % a == 0) {
printf("ERROR");
goto end;
}
}
array[n] = 0;
multiples = n;
multiples += n;
while (multiples < 2000000) {
array[multiples] = 2;
multiples += n;
}
}
}
// read array and sum primes
for (n = 0; n < 2000000; n++) {
if (array[n] == 0) // IF n IS PRIME
{
sum += n;
} else
(array[n] == 2) // IF n IS COMPOSITE
{
continue;
}
else(array[n] == 1) // IF n MAY/MAY NOT BE PRIME
{
printf("ERROR");
goto end;
}
}
printf("The sum of all primes < 2,000,000 is... %ld!\n", sum);
end:
getchar();
return 0;
}
答案 0 :(得分:4)
将else
更改为else if
,你没事。
使用所有 else
。
答案 1 :(得分:0)
你真的遗失了一些与你if
一起的else
:
if( array[n] == 0) // IF n IS PRIME
{
sum += n;
}
else if( array[n] == 2) // IF n IS COMPOSITE
{
continue;
}
else if( array[n] == 1) // IF n MAY/MAY NOT BE PRIME
{
printf("ERROR");
goto end;
}
很容易混淆这样的编译器,当你这样做时,它的一些错误信息很难理解。
答案 2 :(得分:0)
else( array[n] == 2) // IF n IS COMPOSITE (is a multiple)
{ //THIS IS LINE 49
else
没有条件。 else
应为else if
。
编译器的语法恢复尝试建议最简单的更改,这将导致语法上有效的程序。通常建议的更改没有多大意义。在这种情况下,在;
之后添加else
会将以下( array[n] == 2)
转换为表达式语句的开头(必须由其他人跟随)分号)。
如果您的代码产生语法错误消息,最好的方法通常是忽略它所做的建议,只看它引用的行和它前面的行,并且图那时语法有什么问题。然后修复错误并重新编译。