1.
int main()
{
char str[] = { 'g', 'o', 'o', 'd' };
char str1[8] = { 'g', 'o', 'o', 'd', '!' };
char str2[8] = "good!";
//char *str3 = "good!";
printf("%d\n", sizeof(str));//4
printf("%s\n", str);
printf("%d\n", sizeof(str1));//8
printf("%d\n", sizeof(str2));//8
system("pause");
return 0;
}
2.如下程序输出结果是 8
int fun(int x)
{
int count = 0;
while (x)
{
count++;
x = x & ( x - 1);
}
return count;
}
int main()
{
printf("%d\n", fun(2019));//8
//2019转化为二进制为 0111 1110 0011 有8个0
system("pause");
return 0;
}
思路: 将x转化为2进制,看含有的1的个数。
注: 每执行一次x = x&(x-1),会将x用二进制表示时最右边的一个1变为0,因为x-1将会将该位(x用二进制表示时最右边的一个1)变为0。
x = x&(x-1)就是将x最右边的二进制位1变为0。x为2019时二进制为1的位有8个,所以结果为8.
利用x&(x-1)表达式,还可以用来判断一个数(x)是否是2的n次方。如果一个数是2的n次方,那么这个数用二进制表示时其最高位为1,其余位全部为0。
3.如下程序的 输出结果是 4
int func(int a)
{
int b = 0;
static int c = 3;
a = c++, b++;
return (a);
}
int main()
{
int a = 2, i, k;
for (i = 0; i < 2; i++)
{
k = func(a++);
}
printf("%d\n", k);//4
system("pause");
return 0;
}
4.如下程序输出结果是 24
int main()
{
int s = 0, n;
for (n = 0; n < 4; n++)
{
switch (n)
{
default:s += 4;
case 1:s += 1;
case 2:s += 2;
case 3:s += 3;
}
}
printf("%d\n", s);//24
system("pause");
return 0;
}
n=0时,程序运行default 语句,因为没有break. 所以接着运行case1,case2,case3语句。