我做了一个使用unsigned int打印的函数:
ssize_t putc_fdr(char c, int fd)
{
return (write(fd, &c, sizeof(char)));
}
ssize_t putuint_fdr(uintmax_t i, int fd)
{
return (i != 0 ? putuint_fdr(i / 10, fd) + putc_fdr(i % 10 + '0', fd) : 0);
}
但它对i = 0不起作用,因为该函数不打印任何东西。
如果我将': 0'
替换为': putc_fdr('0', fd)'
,则无效,因为如果我> 10,在递归结束时,将始终打印一个额外的'0'。 (逻辑。)
但是,如果开头i为0,如何打印0?
答案 0 :(得分:4)
不是停在零,而是在达到一位数时停止。
您应该通过抛弃?:
运算符来修复排序问题(从而确保正确的打印顺序),并允许您的函数采用默认行为,重复次数较少:
ssize_t putuint_fdr(uintmax_t i, int fd) {
ssize_t ret1 = 0;
if(i / 10 != 0)
ret1 = putuint_fdr(i / 10, fd);
if (ret1 < 0)
return ret1;
ssize_t ret2 = putc_fdr(i % 10, fd);
if (ret2 < 0)
return ret2;
return ret1 + ret2;
}
答案 1 :(得分:1)
考虑你的表达方式:
(i != 0 ? putuint_fdr(i / 10, fd) + putc_fdr(i % 10 + '0', fd) : 0);
首先,它检查条件i != 0
。然后,如果条件为真,它将:
使用语句putuint_fdr(i / 10, fd)
致电putc_fdr(i % 10 + '0', fd)
将两者的返回值相加并且不做任何操作。
请注意,它可以按任何顺序调用函数。
如果i = 0,它将:
return 0
实际上什么都不会做,只是代码中间的一个数字。你需要调用一个函数来写0,而不是只说“0”
答案 2 :(得分:0)
由于二进制SELECT DISTINCT(tema.nombre) as Tema, count(frase.texto)AS 'Nº Frases' FROM tema_frase RIGHT JOIN tema ON tema_frase.tema_id=tema.tema_id LEFT JOIN frase ON frase.id=tema_frase.frase_id GROUP BY tema.nombre
未被排序,因此您需要强制执行评估操作数的所需顺序。大多数情况下,打印单个数字意味着您要先打印MSD,因此您将推迟打印数字,直到建立MSD为止。这意味着您要先递归,然后在从递归调用返回时进行打印。
如果要保留当前的代码结构,可以使用逗号运算符+
对两个调用进行排序。为了解决您的困境,我们检测输入何时是一位数。
,
这假定ssize_t putuint_fdr(uintmax_t i, int fd)
{
ssize_t ret = 0;
return (i / 10 != 0
? ret = putuint_fdr(i / 10, fd),
ret + putc_fdr(i % 10 + '0', fd)
: putc_fdr(i + '0', fd));
}
在打印号码时不会返回错误。如果你想增加额外的稳健性,你也应该尝试考虑这种情况。
在对此答案的评论中,您问:
没有办法不使用变量并保持顺序调用? (
write
)
您需要某种变量来添加两个有序函数调用的结果。但是,您可以通过将第一个函数调用的结果作为参数传递给第二个函数调用来隐藏赋值。
ret ssize_t