以下代码打印出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);
}
}
答案 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]'相同的数字。
}