for循环条件
i["]<i
这个表达式利用了在C语言中数组索引是可交换的这一事实。它等价于:
"]<i
因此,当位置i处的字符为\0
,即字符串结束时,循环将终止,该字符串长度为14个字符(恰好与"hello, world!\n"的长度相同)。 因此,可以将for
循环条件重写为:
i != 14
字符算术
read('-' - '-', i++ + "hello, world!\n", '/' / '/')
char
是一种整数类型,因此:
修复了所有编译器警告(例如隐式整型转换为指针),并简化了上述内容后,代码变成了:
#include <unistd.h>
int i = 0;
void read2(int, char*, int);
int main()
{
while (i != 14)
{
read2(0, i++ + "hello, world!\n", 1);
}
return 0;
}
void read2(int j, char* i, int p)
{
write(j / p + p, i-- - j, 1);
}
(我将read
重命名为read2
,以避免与Unix的read
函数发生冲突。)
请注意,对于read2
函数,j
和p
参数是不需要的,因为该函数总是以j=0和p=1的形式调用。
#include <unistd.h>
int i = 0;
void read2(char*);
int main()
{
while (i != 14)
{
read2(i++ + "hello, world!\n");
}
return 0;
}
void read2(char* i)
{
write(1, i--, 1);
}
write(1, i--, 1)
的调用会把i
中的一个字符写到文件描述符1(标准输出),而后缀--是多余的,因为这个i
是一个局部变量,在之后没有被引用。所以这个函数等同于putchar(*i)
。
将read2
函数嵌入到主循环中可得:
#include <stdio.h>
int i = 0;
int main()
{
while (i != 14)
{
putchar(*(i++ + "hello, world!\n"));
}
return 0;
}
其意义显而易见。
write()
没有被定义。;-)(我知道这可能是要调用POSIX write()函数,但这并没有在任何地方说明。) - DevSolarread()
的 K&R 风格声明了。它可能无法直接在现代编译器中编译通过。如果这出现在面试中,它只有作为一个关于人们在代码周围玩游戏的谈话开端才有意义,并且可以看到受访者如何解决这个难题... - RBerteig