这个函数f1()将如何执行?

时间:2018-01-14 13:35:49

标签: c operators

#include <stdio.h>
void f1(char* str, int index)
{
   *(str + index) &= ~32;
}
int main()
{
   char arr[] = "gatecsit";
   f1(arr, 0);
   printf("%s", arr);
   return 0;
}

功能 f1()如何工作?
特定的 *(str + index)&amp; =〜32; 这个.... 感谢

3 个答案:

答案 0 :(得分:1)

我认为f1()通过利用ASCII的属性来大写字符串的第一个字母,这意味着相应的大小写字母相差32个。例如,'A'的代码是65,而''的代码是' a'是97.代码的'&amp; = ~32'位将转换为字符str [index]的ASCII表示的第5位,这应该将'g'变为'G'。对于只包含普通字母的字符串,这应该没问题,但会对数字和标点符号产生奇怪的影响。

答案 1 :(得分:1)

表达式

*(str + index)

相当于

str[index]

所以位置index的角色按以下方式改变

*(str + index) &= ~32;

在ASCII表中,小写字母与大写字母不同,还有一个设置位。例如,小写字母'a'的代码为十六进制61,而大写字母'A"的代码为十六进制41。因此,差异等于十六进制中{16}的十进制值等于20的值。

因此,原始表达式将字符中的相应位重置为0,将小写字母转换为大写字母。

答案 2 :(得分:1)

代码从字符中删除1位  从字节或0x20中有效地减去32。

#include <stdio.h>
#include <string.h>

void f1(char* str, int index)
{
 // The code removes 1 bit from the character at the position `str[index]`
 // effectively subtracting 32 from that character
 // Capital letters in ASCII are apart by 32 (0x20) from small letters 

 // Since 'a' = 0x61 and 'A' = 0x41  'a' - 32 = 'A'
 // Since 'b' = 0x62 and 'B' = 0x42  'b' - 32 = 'B'

 // `~` is a binary negation operator 0 -> 1;  1 -> 0
 // `&` is a binary AND
 // x &= y; is equivalent to x = x & y;

 // ~0x20 = 0b11011111    

   *(str + index) &= ~0x20; // 0x20 = 32;
}


int main()
{
   int i;
   char arr[] = "gatecsit";
   size_t len = strlen(arr);


  for(i = 0; i< len; i++)
      printf(" %c " , arr[i]);   

   printf("\n");

  for(i = 0; i< len; i++)
      printf(" %X" , arr[i]);

   printf("\n");

  // convert all letters:  
   for(i = 0; i< len; i++)
      f1(arr, i);

   printf("\n");

  for(i = 0; i< len; i++)
      printf(" %c " , arr[i]);  

   printf("\n");

  for(i = 0; i< len; i++)
      printf(" %X" , arr[i]);

   return 0;
 }

输出: 小和大写是相隔0x20(或十进制32)的字母。 从这个打印输出中可以清楚地看到这一点:

 g  a  t  e  c  s  i  t 
 67 61 74 65 63 73 69 74

 G  A  T  E  C  S  I  T 
 47 41 54 45 43 53 49 54