(前言:我根本不是程序员,但我正在研究它,所以我可以对它的工作方式有所了解,所以请忍受我的无知!)
我一直在c.learncodethehardway.org上完成C语言教程。当我在9号卡住时,进行了大约8次练习。这是链接:
http://c.learncodethehardway.org/book/ex9.html
我几乎掌握了所有这一切,除非它让作者在"你应该看到的"部分。这是相关代码的复制/粘贴:
#include <stdio.h>
int main(int argc, char *argv[])
{
int numbers[4] = {0};
char name[4] = {'a'};
// first, print them out raw
printf("numbers: %d %d %d %d\n",
numbers[0], numbers[1],
numbers[2], numbers[3]);
printf("name each: %c %c %c %c\n",
name[0], name[1],
name[2], name[3]);
printf("name: %s\n", name);
// setup the numbers
numbers[0] = 1;
numbers[1] = 2;
numbers[2] = 3;
numbers[3] = 4;
// setup the name
name[0] = 'Z';
name[1] = 'e';
name[2] = 'd';
name[3] = '\0';
// then print them out initialized
printf("numbers: %d %d %d %d\n",
numbers[0], numbers[1],
numbers[2], numbers[3]);
printf("name each: %c %c %c %c\n",
name[0], name[1],
name[2], name[3]);
// print the name like a string
printf("name: %s\n", name);
// another way to use name
char *another = "Zed";
printf("another: %s\n", another);
printf("another each: %c %c %c %c\n",
another[0], another[1],
another[2], another[3]);
return 0;
}
程序在屏幕上打印的内容如下所示:
numbers: 0 0 0 0
name each: a
name: a
numbers: 1 2 3 4
name each: Z e d
name: Zed
another: Zed
another each: Z e d
$
在本教程中,令我困惑的是作者的这句话:
&#34;当打印每个名称元素时,只有第一个元素&#39; a&#39;显示是因为&#39; \ 0&#39;角色很特别,不会显示。&#34;
我发现这很奇怪,因为我将名称定义为&#39; a&#39;在顶部,但我从来没有喊出过&#39; \ 0&#39; 之后的字符我第二次打印名称变量。
为什么不用“a a a a a a”打印,就像打印出的数字一样&#39; 0 0 0 0&#39;?是否与“&#39; &#39;在一个?
答案 0 :(得分:5)
为什么不用'a a a a'打印,与打印的数字相同 出'0 0 0 0'?
因为未给定显式初始值设定项的任何数组值(在初始化数组中)都会默认初始化为零。 ('\ 0'只是将NUL /零值指定为字节的另一种方式)
是否与a'周围有关?
不,只是那个
char name[4] = {'a'};
在逻辑上等同于:
char name[4] = {'a', 0, 0, 0};
在逻辑上等同于:
char name[4] = {'a', '\0', '\0', '\0'};
请注意,任何与C字符串兼容的函数(包括printf())都会将零字节识别为指示字符串的结尾,并在遇到零字节时停止读取该字符串。这就是为什么只打印“a”。
答案 1 :(得分:1)
大多数C编译器会使用整数0自动初始化未指定的数组值。这不仅适用于整数数组,也适用于字符数组。
现在,字符文字\0
的值为0.而在C中,字符值存储为ASCII值。因此,当编译器将0添加到字符数组的其余部分时,它们将被视为\0
文字或null,这也用于标记字符串的结尾。
作为证据,在您的示例中,如果使用
替换单个字符数组元素的print语句printf("name each: %c %d %d %d\n",name[0], name[1], name[2], name[3]);
你会发现它打印出来:
name each: a 0 0 0
这是因为我们使用了%d
格式说明符,它是整数值而不是%c
格式说明符,它需要一个字符值。由于整数值零与\0
相同,因此字符串终止。
答案 2 :(得分:0)
因为你使用的东西是:
char name[4] = {'a'};
名称[0] = a ,其余没有任何内容(仅限&#39; \ 0&#39;),其余我的意思是名称[1],名称[2] ,...
答案 3 :(得分:0)
为什么通过阅读被称为K&amp; R C,第2版的书,以简单的方式学习C语言是“艰难的”。