Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如果数字为非零且为空,如何使用printf打印数字?_C_Printf_Ternary Operator_Conditional Operator - Fatal编程技术网

C 如果数字为非零且为空,如何使用printf打印数字?

C 如果数字为非零且为空,如何使用printf打印数字?,c,printf,ternary-operator,conditional-operator,C,Printf,Ternary Operator,Conditional Operator,我有以下函数,如果I值为0,它会给出一些奇怪的输出 有人能给我解释一下为什么这会很奇怪吗?我的意图是仅在值非零时打印该值,否则该值应为空 # include<stdio.h> int main(int argc, char *argv[]) { int i=0; printf("Number is %d\n", i ? i : ""); return 0; } -> gcc print.c print.c: In function 'main': p

我有以下函数,如果I值为0,它会给出一些奇怪的输出 有人能给我解释一下为什么这会很奇怪吗?我的意图是仅在值非零时打印该值,否则该值应为空

# include<stdio.h>

int main(int argc, char *argv[]) {
    int i=0;
    printf("Number is %d\n", i ? i : "");
    return 0;
}

-> gcc print.c
print.c: In function 'main':
print.c:5: warning: pointer/integer type mismatch in conditional expression
-> ./a.out
Number is 4195848
如果必须使用,可以根据
i
的值计划控制整个
printf()
,如

int i=0;
i? printf("Number is %d\n", i): (void)i;
return 0;
或者,如果您希望始终打印
编号
,请像这样使用它

int i=0;
i? printf("Number is %d\n", i): puts("Number is");
return 0;

指定精度为0:

printf("Number is %.0d\n", i);
根据C标准对
d
格式代码的描述,增加了强调(§7.21.6.3):

int
参数应转换为“[-]dddddd”格式的带符号十进制数。精度指定要显示的最小位数;如果转换的值可以用较少的数字表示,则应使用前导零展开。默认精度为1以明确的零精度转换零的结果不得包含任何字符。


printf
的这一功能有时很有用,尤其是在生成希望不打印
0
条目的表格输出时。格式代码(如
%8.0d
)将右对齐8个字符字段中的整数值,如果值为0,则打印8个空格。(字段宽度应用于转换后的值。)

可能是这样的:

int main(void)
{
    int i = 30;
    return (i != 0) ? printf("Number is: %d", i) : i;
}

这个愚蠢问题的答案(不妨把我的帽子扔进拳击场)


也可以去掉三元运算符

另外,阅读类型在中的工作方式。无法使用同一说明符将两种不同的类型传递给
printf()
,因为这是未定义的行为。第二个代码段中的
else
子句不起任何作用,并且可以删除。这是不正确的,因为编号为displayed@EdHeal:op可能希望显示
编号为
@EdHeal:输出不是很清晰,但这是op要求的。@EdHeal你是对的,我也提供了与该想法一致的答案,但如果你看到op的想法,也许
编号是
零件总是被打印出来。OP也要求使用相同的“逻辑”来完成。我认为这意味着它应该使用与三元运算符相同的语法来完成(“logic”一词的选择有点不清楚,但这将是我对它的理解),但main不会总是返回零。返回打印的字符数(如果有)似乎更有用,否则返回零。当然,您可能会说,非零返回可能表示错误…;)那是个坏主意。写清楚的代码,
if
在这里绝对合适。@Olaf:不过,OP似乎想使用条件语句……此人提到他/她知道可以用
if
语句来完成。不管出于什么原因,这个人似乎倾向于使用三元运算符。@iRove108:所以有人站在他身后,手里拿着枪?也许我有更好的老师,但当他们被证明是错误的时候,即使是学生,他们中的大多数人都会接受纠正。但这些都是过去的日子…@Olaf:很公平。我明白了。@Olaf这就是为什么我必须写这封信。使用三元运算符是可能的,但不是OP预期的方式。
int main(void)
{
    int i = 30;
    return (i != 0) ? printf("Number is: %d", i) : i;
}
i && printf("Number is %d\n", i);