我偶然发现了以下代码片段:
char firstname[40+1];
char lastname[40+1];
为什么这个人不只是使用41作为数组长度?为什么他还使用像41这样的奇数?
我现在无法提供任何例子,但我已经多次看过这种模式,并且从未理解它的重点。
答案 0 :(得分:7)
我们这样做的原因相同:
double normal_pdf(double x) {
return (1.0 / sqrt(2.0 * pi)) * exp(x * x / 2.0);
// or even...
return (1.0 / sqrt(8.0 * atan(1.0)) * exp(x * x / 2.0);
}
而不是......
double normal_pdf(double x) {
return 0.3989422804014327 * exp(x * x * 0.5);
}
这两个版本将产生相同的机器代码,具有一个不错的优化编译器,但第一个版本显然是正确的而第二个版本可能是错误的 - 或者至少它需要更长的时间人类读者验证代码是否正确。
我怀疑在char field[40+1]
的情况下,+1
用于保存NUL终结符,并且该字段的最大长度为40个字符。
答案 1 :(得分:5)
只是提醒您或其他读取/修改此代码的人,实际的char数组的大小为x。加1表示空终止符。
在C中,事情发生得如此之快,以至于提高可读性的任何事情都值得花时间。
答案 2 :(得分:2)
char firstname[40+1];
40 + 1
用于使其明确表示数组可以包含长度为40
的字符串,但为空终止符保留1
字节。长度为N
的字符串的大小为N + 1
个字节(即,字符串对象的sizeof
为N + 1
)。它用于文档目的。