提问人:Madhu Narayanan 提问时间:10/16/2023 更新时间:11/5/2023 访问量:137
打印为十六进制 (0x) 或十进制,具体取决于没有 if 语句的值 - 如何?
print as HEX (0x) or Decimal depending on value without if statements - how to?
问:
我正在尝试打印一个整数,其格式应为 %d 十进制,除非其值为 FFFF,在这种情况下,它应该打印为0xFFFF。如果没有不必要的 if 和 else 语句,我无法这样做。是否可以在单个 printf 语句中执行此操作?也许使用宏?有什么建议吗?
int d;
if(d==0xFFFF) {
printf("%X",d);
} else {
printf("%d",d);
}
答:
2赞
Fe2O3
10/16/2023
#1
法典:
int main(void) {
for( int e = 0xFFFE; e < 0x10002; e++ )
printf( "%d\n\0%X\n" + ((e == 0xFFFF)<<2), e );
return 0;
}
结果:
65534
FFFF
65536
65537
您将识别条件测试变量的值。真值(0 或 1)向左移动 2 位,有效地将其乘以 4。此值(0 或 4)被添加到 hacky 和自定义格式字符串的地址中,该字符串实际上是两个 C 字符串合二为一。either 或 将用于打印下一个参数。"%d\n\0"
"%X\n\0"
printf()
现在,去阅读手册页,并弄清楚如何打印带有前导的十六进制值。(提示:更改为 将不起作用。为什么不呢?printf()
0x
"..\0%X.."
"..\00X%x.."
不要这样写代码。这绝对是一个黑客......
评论
0赞
chux - Reinstate Monica
10/16/2023
嗯,16 位总是如此。e < 0x10002
int
0赞
Fe2O3
10/17/2023
@chux-ReinstateMonica 如果这样的约束构成了任务的一部分,我敢肯定 OP 会指定数据类型为......short
:-)
0赞
Joshua
11/30/2023
“(提示:更改”..\0%X..“ 更改为 ”..\00X%x..“ 将不起作用。为什么不呢?对我有用。
0赞
Fe2O3
11/30/2023
@Joshua 然后要么你接受“Xffff”作为合法的十六进制表示法,要么你的编译器坏了......
0赞
Joshua
11/30/2023
@Fe2O3:产生输出。int main() { printf("0x%X\n", 0xFFFF); }
0xFFFF
-1赞
chqrlie
10/29/2023
#2
您可以避免使用条件运算符的语句来选择语句:if
printf
d == 0xFFFF ? printf("FFFF") : printf("%d", d);
您可以将其组合到对以下各项的单个调用中:printf
printf(d == 0xFFFF ? "FFFF" : "%d", d);
您可以避免使用条件运算符,并使代码更加隐晦:
printf("FFFF\0%d" + (d != 0xFFFF) * 5, d);
评论
if else
printf(d == 0xffff ? "%X" : "%d", d)
printf((char[]){'%', 'd'+!(d%0xFFFF)*20, 0}, d);
int
d==0xFFFF
d == -1
0xFFFF