d[k]<10?'0'+d[k]: 'A'+d[k]-10 得到'0'+2,那么接下来又该如何转换?

d[k]<10?'0'+d[k]: 'A'+d[k]-10 得到'0'+2,那么接下来又该如何转换?


#include 
int main()
{
   int k =0, d[10], n=418;
   do{
      d[k++]= n%16;
      n = n/16;
   }while(n);

   while( k-->0)
      printf("%c", d[k]<10?'0'+d[k]:  'A'+d[k]-10);
   return 0;

该回答引用ChatGPT

这段代码是将一个十进制数(n = 418)转换为十六进制,并输出结果。

在代码中,首先通过不断对 n 取模并除以 16 的方式将其转换为十六进制,并将结果保存在数组 d 中。在循环结束后,数组 d 中保存的就是 n 的十六进制表示,只不过是从低位到高位存储的。

接下来的循环是将数组 d 中的元素转换为 ASCII 字符,并输出到控制台上。这里使用了一个三目运算符 d[k]<10?'0'+d[k]: 'A'+d[k]-10 来实现将十六进制数转换为 ASCII 字符的功能。这个运算符的意思是,如果 d[k] 的值小于 10,就返回字符 '0' 加上 d[k] 的值,否则返回字符 'A' 加上 d[k] 的值减去 10。例如,如果 d[k] 的值是 2,那么这个运算符将返回字符 '0' 加上 2,即 '2';如果 d[k] 的值是 11,那么运算符将返回字符 'A' 加上 1,即 'B'。

综上,这段代码的输出结果应该是 1A2,这是数值 418 的十六进制表示,其中字符 '1' 对应十六进制的 1,字符 'A' 对应十六进制的 10,字符 '2' 对应十六进制的 2。

这个代码用于将十进制数字418转为对应十六进制,以字符形式输出结果,具体如下:

首先,使用do-while循环,将数字418逐次对16求余,求出对应十六进制数字的各数位对应的十进制-2,10,1,从低位往高位,分别依次存储于数组从0往后的各元素位置;

然后,从数组最后一个元素,即对应十六进制的最高位开始计算,将其转为对应的十六进制字符,具体如下:

d[k]<10?'0'+d[k]: 'A'+d[k]-10语句,里面是个条件运算语句,含义是:

当此数位的数字小于10为真时,则将其转为对应的数字字符,因为数字0-9的字符在ASCII码是依0-9的顺序存储的,例如,'0'的十进制ASCII码为48, '1'十进制的ASCII码为49,所以将数字1转为对应的数字字符,即可用'0'+1来表示,0-9其他数字也可以类似的方式来转换,所以'0'+d[k],即可将d[k]的数字转为对应的数字字符。

然后后面部分的含义是,当d[k]<10为假,即d[k]>=10时,同样也是转为对应十六进制字符,不过是字母'A'到'F',具体原理和前面类似,也是依据字母'A'-'F'在ASCII表中,依次顺序存储,所以也可以以'A'+d[k]的形式来将d[k]转为对应的十六进制字符,例如,d[k]里面存储的是12,10对应为'A',计算12对应的十六进制,即为'A'+(12-10)='C'.

while循环里面的转换大概是:1--->'1' , 10--->'A', 2--->'2',然后循环结束即已将数字418转为对应的十六进制字符:1A2.

测试如下:

参考链接:


https://blog.csdn.net/weixin_34916118/article/details/117204060

 
#include <stdio.h>
int main()
{
   int k =0, d[10], n=418;
   do{
       //printf("d[%d]=%d\n",k,n%16); 
      d[k++]= n%16;     
      n = n/16;
   }while(n);
 
   while( k-->0)
      printf("%c", d[k]<10?'0'+d[k]:  'A'+d[k]-10);
   return 0;
}

img

接下来是指什麽?是指printf啥么?'0'+2就是字符'2'啊,所以输出的是字符‘2‘