考试Q& A,我不明白

时间:2014-05-14 22:28:36

标签: c command-line

以下代码打印出5.有人可以向我解释一下吗?我想我对数学很困惑;例如,使用'0'而不是0以及如何在纸上进行数学运算......

      #include <stdio.h>

      int main (int argc , char * argv [])
      {
       char * c_pt ;
       int n = 0;
       if( argc == 2)
       {
         c_pt = argv [1];
         while (* c_pt )
         {
           if (* c_pt < '0' || * c_pt > '1') break ;
           n = n*2 + * c_pt - '0';
           c_pt ++;
         }
         printf ("%d\n", n);
       }
     }

2 个答案:

答案 0 :(得分:2)

当您访问包含数字的字符串中的字符时,您可能会获得字符“0”或“1”。但是'0'的整数值是48,整数值'1'是49,所以如果你想把它们变成整数0和1算术,你需要减去一些东西。您可以减去48但是下一个读取您代码的人不知道您为什么这样做。因此,您可以减去由值表示的字符:'0' - '0'= 0和'1' - '0'= 1

此特定程序从命令行读取包含二进制数的字符串(因此字符串包含字符'0'和'1')并通过首先转换'0'和'将该二进制数转换为十进制数1'在* c_pt到0和1,然后将其添加到n中构建的十进制数。它通过从0开始然后在每次迭代中将数字乘以2(这只是将所有内容都移位一位)然后添加下一个数字来实现。因此,如果字符串包含10101,则会遵循以下步骤:

number  = 0

input   = 10101
pointer = ^
number  = number*2 + *pointer = 0*2 + ('1'-'0')  = 0*2 + 1  = 1  (in binary: 1)

input   = 10101
pointer =  ^
number  = number*2 + *pointer = 1*2 + ('0'-'0')  = 1*2 + 0  = 2  (in binary: 10)

input   = 10101
pointer =   ^
number  = number*2 + *pointer = 2*2 + ('1'-'0')  = 2*2 + 1  = 5  (in binary: 101)

input   = 10101
pointer =    ^
number  = number*2 + *pointer = 5*2 + ('0'-'0')  = 5*2 + 0  = 10 (in binary: 1010)

input   = 10101
pointer =     ^
number  = number*2 + *pointer = 10*2 + ('1'-'0') = 10*2 + 1 = 21 (in binary: 10101)

答案 1 :(得分:0)

  void main ( void )
  {
    int a[] = {22, 33,44};

'a'是3 int,22,33和44的静态数组(或字符串)。

    int *x = a;

'x'是一个int指针,初始化为指向与'a'相同的静态数组。

    printf (" sizeof ( int )=% lu ", sizeof (int ));

打印在此系统上表示int类型所需的字节数[4]。

    printf ("x=%p, x [0]=% d\n", x, x [0]);

打印int指针'x'当前指向的内存地址[0x7fff29af6530], 然后还打印从该地址开始的[4]字节中存储的整数值[22]。 (注意:'x [0]'与'* x'相同。)

    x = x + 2;

    x   [0x7fff29af6530]
   +2               + 8 (or (2 * 4) or (2 * sizeof(int)))
  ----  ----------------
new x   [0x7fff29af6538]

将指针'x'提前8个字节。

对'x'的影响是它现在将指向其原始内存地址加'(2 * sizeof(int))'字节。 'a [2]'解析到同一个位置。

    printf ("x=%p, x [0]=% d\n", x, x[0]);

打印int指针'x'当前指向的内存地址[0x7fff29af6538] 然后还打印从该地址开始的[4]字节中存储的整数值[44]。

因此; 'x'现在解析为与'&amp; a [2]'相同的地址;并且'* x'解析为与'a [2]'相同的数字。

   }