为什么此代码在 ANSI C 中出现编译错误?
Why this code got compile error in ANSI C?
我正在一个名为 UVa Online Judge 的站点上解决一个基本的 C 问题,我遇到了一个似乎与编译器选项有关的错误。
ANSI C 5.3.0 - GNU C Compiler with options: -lm -lcrypt -O2 -pipe -ansi -DONLINE_JUDGE
问题(以问题id为前缀)是UVa 100 3n+1 problem
如下。它可以编译并且 运行,没有错误,在 Visual Studio 2019 年,该站点为其报告“编译错误”。该站点不会显示任何错误消息,只会在其公告中显示 Compile Error
。
#include <stdio.h>
int get_cycle_length(int n);
int main() {
int i, j;
int l, r;
int max;
int n;
int cycle_length;
char line[10000] = { 0 };
size_t line_len = sizeof(line), read_len = 0, pos = 0;
while (scanf(" %d%d", &i, &j) != EOF) {
l = i > j? j: i;
r = i > j? i: j;
max = -1;
for (n = l; n <= r; n++) {
cycle_length = get_cycle_length(n);
if (cycle_length > max)
max = cycle_length;
}
read_len = snprintf(line+pos, line_len-pos, "%d %d %d\n", i, j, max);
if (pos+read_len > line_len) {
printf("%.*s", (int)pos, line);
pos = 0;
}
pos += read_len;
// printf("%d %d %d\n", i, j, max);
}
printf("%.*s", (int)pos, line);
return 0;
}
int get_cycle_length(int n) {
int count = 0;
while (n != 1) {
count++;
n = n & 1? 3*n+1: n/2;
}
count++;
return count;
}
您在代码中使用了 C++ 风格的注释,即 //
。
许多 C 编译器将允许这些类型的注释作为扩展,但严格的 ANSI C 不允许。您需要使用 C 风格注释 /* ... */
.
所以不是这个:
// printf("%d %d %d\n", i, j, max);
这样做:
/*
printf("%d %d %d\n", i, j, max);
*/
我正在一个名为 UVa Online Judge 的站点上解决一个基本的 C 问题,我遇到了一个似乎与编译器选项有关的错误。
ANSI C 5.3.0 - GNU C Compiler with options: -lm -lcrypt -O2 -pipe -ansi -DONLINE_JUDGE
问题(以问题id为前缀)是UVa 100 3n+1 problem
如下。它可以编译并且 运行,没有错误,在 Visual Studio 2019 年,该站点为其报告“编译错误”。该站点不会显示任何错误消息,只会在其公告中显示 Compile Error
。
#include <stdio.h>
int get_cycle_length(int n);
int main() {
int i, j;
int l, r;
int max;
int n;
int cycle_length;
char line[10000] = { 0 };
size_t line_len = sizeof(line), read_len = 0, pos = 0;
while (scanf(" %d%d", &i, &j) != EOF) {
l = i > j? j: i;
r = i > j? i: j;
max = -1;
for (n = l; n <= r; n++) {
cycle_length = get_cycle_length(n);
if (cycle_length > max)
max = cycle_length;
}
read_len = snprintf(line+pos, line_len-pos, "%d %d %d\n", i, j, max);
if (pos+read_len > line_len) {
printf("%.*s", (int)pos, line);
pos = 0;
}
pos += read_len;
// printf("%d %d %d\n", i, j, max);
}
printf("%.*s", (int)pos, line);
return 0;
}
int get_cycle_length(int n) {
int count = 0;
while (n != 1) {
count++;
n = n & 1? 3*n+1: n/2;
}
count++;
return count;
}
您在代码中使用了 C++ 风格的注释,即 //
。
许多 C 编译器将允许这些类型的注释作为扩展,但严格的 ANSI C 不允许。您需要使用 C 风格注释 /* ... */
.
所以不是这个:
// printf("%d %d %d\n", i, j, max);
这样做:
/*
printf("%d %d %d\n", i, j, max);
*/