我有以下功能,如果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
我知道我可以像下面这样做,但我想用上面的逻辑
做同样的事情if(i != 0) {
printf("%d", i);
} else {
printf("%s", "");
}
答案 0 :(得分:5)
指定精度0:
printf("Number is %.0d\n", i);
根据C标准对d
格式代码的描述,增加了重点(§7.21.6.3):
int
参数应转换为样式为“[ - ] dddd”的带符号小数。精度指定要显示的最小位数;如果转换的值可以用较少的数字表示,则应使用前导零进行扩展。默认精度为1. 使用显式精度零转换零的结果不应为字符。
printf
的此功能偶尔会有用,特别是在生成表格输出时,您希望不打印0
条目。格式代码(如%8.0d
)将右对齐8个字符的字段中的整数值,如果值为0,则打印8个空格。(字段宽度应用于转换后的值。)
答案 1 :(得分:2)
如果必须使用conditional statement,您可以根据printf()
的值计划控制整个i
,例如
int i=0;
i? printf("Number is %d\n", i): (void)i;
return 0;
或者,如果您希望始终打印Number is
,请使用
int i=0;
i? printf("Number is %d\n", i): puts("Number is");
return 0;
答案 2 :(得分:0)
也许是这样的:
int main(void)
{
int i = 30;
return (i != 0) ? printf("Number is: %d", i) : i;
}
答案 3 :(得分:0)
回答这个愚蠢的问题(不妨把我的帽子扔进戒指)
i && printf("Number is %d\n", i);
也摆脱了三元运算符!