6

我正在尝试使用C 编程语言学习 C 的基础知识 - Brian Kernighan 和 Dennis Ritchie

在下面的程序中,我不明白'maxlineLength' 的值来自哪里?

for 循环设置为在 ' i' 小于时运行maxLineLength-1,但它的值是什么maxLineLength以及它来自哪里?

据我了解,当在这样的函数中声明参数时,会将值传递给它们,所以它们肯定必须在其他地方声明才能传递值?

#include <stdio.h>
#define MAXIMUMLINELENGTH 1000
#define LONGLINE 20

main() {
 int stringLength;
 char line[MAXIMUMLINELENGTH];

  while((stringLength = getLineLength(line, MAXIMUMLINELENGTH)) > 0)
    if(stringLength < LONGLINE){
  printf("The line was under the minimum length\n");
    }
    else if (stringLength > LONGLINE){
        printf("%s", line);
    }
  return 0;
}


int getLineLength(char line[], int maxLineLength){
  int i, c;

  for(i = 0; i< maxLineLength-1 && ((c = getchar())!= EOF) && c != '\n'; i++)
    line[i] = c;

  if(c == '\n') {
      line[i] = c;
      i++;
  }

  line[i] = '\0';
  return i;
}
4

5 回答 5

5

据我了解,当在这样的函数中声明参数时,会将值传递给它们,所以它们肯定必须在其他地方声明才能传递值?

在这种情况下,函数同时被声明和定义。Pre-ANSI C 允许这样做。这在今天被认为是一种不好的做法。您应该添加前向声明

int getLineLength(char line[], int maxLineLength);

上面main是为了避免隐式声明函数。

当缺少此前向声明时,该函数的第一次使用将成为其隐式声明。编译器采用您传递的表达式参数的类型,并假定函数采用相应的类型作为其参数。它还假设函数返回一个int. 在这种情况下,编译器拥有找出正确签名所需的所有信息,因此函数定义正确。但是,在更复杂的情况下(例如,如果maxLineLength声明为long long,而不是int),它会导致未定义的行为,因此您应该始终包含函数的前向声明。

于 2013-05-19T10:22:06.340 回答
3
getLineLength(line, MAXIMUMLINELENGTH)

MAXLINELENGTH被定义为常数

内部函数getLineLength是这个值“映射”到maxLineLength变量

于 2013-05-19T10:20:31.327 回答
3

maxLineLengthgetLineLength函数的参数/参数。调用此函数时,您应该传入该行的最大长度。

main函数中,它在这里完成:

getLineLength(line, MAXIMUMLINELENGTH)

他作为最大行长度传入MAXIMUMLINELENGTH,这等于1000代码中的此定义可以看出:

#define MAXIMUMLINELENGTH 1000

这些#defines 特定于预处理器。它在编译之前替换了MAXIMUMLINELENGTHwith的所有实例。1000

于 2013-05-19T10:20:36.687 回答
2

线

#define MAXIMUMLINELENGTH 1000

是谜题的线索

于 2013-05-19T10:20:27.557 回答
2

C 源文件在编译之前进行了预处理。

#define MAXIMUMLINELENGTH 1000是一个C 预处理器指令,指示预处理器将所有出现的字符串替换MAXIMUMLINELENGTH1000.

如果您MAXIMUMLINELENGTH在整个编译单元(.C 文件)中始终使用并在以后决定应该更改行长,您只需更改预处理器指令,然后该更改将反映在整个编译单元中。

所以这条线 getLineLength(line, MAXIMUMLINELENGTH)被预处理器转换为 getLineLength(line, 1000)

于 2013-05-19T10:24:22.550 回答