C语言中易错和难理解的题目

前言

这是一些给专升本的同学讲题目的时候遇到的一些比较难于理解的题。总结在此,便于查阅和应试。

二进制和原反补码

//=========================int 16==================================
	//计算机中的存储(补码):[1]111 1111 1111 1111
    //反码:                   1 111 1111 1111 1110
	//原码:                   1 000 0000 0000 0001
	//=========================int 32==================================
	//补码:0000 0000 0000 0000 1111 1111 1111 1111
	//转八进制:
	//0000 0000 0000 00(00 1)(111) (111)(111)(111)(111)
	//                    1    7
	//
	//看十进制:+65535
	//a= 65535, 177777, ffff, 65535
	//unsigned int a = 65535; 
	//printf("a = %d, %o, %x, %u\n", a, a, a, a);
	//2: 10
	//原码:[]000 0000 0000 0000 0000 0000 0000 0010
	//反码:[]111 1111 1111 1111 1111 1111 1111 1101
	//补码: 1111 1111 1111 1111 1111 1111 1111 1110
	//-2的补码(计算机内存中存储形式):1111 1111 1111 1111 1111 1111 1111 1110
	//二进制转八进制:(011)(111)(111)(111)(111)(111)(111)(111)(111)(111)(110)
	//                   3       7                                                              6 
	//二进制转十六进制:
	//二进制转十进制:按权展开
	//b = -2, 37777777776, fffffffe, 4294967294
	//int b = -2;
	//printf("b = %d, %o, %x, %u\n", b, b, b, b);

二进制移位

	printf("%d\n", 010);
	// 1000  10000
	printf("%d\n", 010 << 1);
	//10000 00001 == 10001
	printf("%d\n", 010 << 1 ^ 1);
	//17
	printf("%o\n", 010 << 1 ^ 1);
	//17
	printf("%x\n", 010 << 1 ^ 1);

指针常量

//int a[4];
	//printf("%d\n", *a);
	//printf("%d\n", a[0]);
	//printf("%d\n", a);
	//a + 1;
	//a是指针常量,本身是不能做++操作的
	a++;
	//printf("%d\n", a);

转义符

1

	char s[] = "\\ 1 4 1 \141 a b c \t";
	//缺少右引号
	//char s1[] = "\";
	char s2[] = "\\";
	char s3[] = "\141";
	char s4[] = "\t";

	printf("%d\n", strlen(s));//9
	printf("%d\n", strlen(s2));//1
	printf("%d\n", strlen(s3));//1
	printf("%d\n", strlen(s4));//1
	//这里的141是八进制,所以就是十进制的97,即字符a
	printf("%c\n", '\141'); //(a)

2

printf("ab c\t de\rf\tg\n");
printf(" h\ti\b\bj k\n");
f       gde
 h     j k

解析:
\r 回车,是到行首
\b 退格

字符串、数组和指针

数组初始化问题

以下能正确定义一维数组的是( )。
A) int a[5]={0,1,2,3,4,5};
错误
E0146 初始值设定项值太多
B) int a[5]=”012345”;
错误
E0520 应使用“{…}”初始化聚合对象
C) char a[ ]=”012345”;
正确

	char  a[] = "012345";

  for (int i = 0; i < 6; i++)
  {
  	printf("%c\n", a[i]);
  }

运行结果

0
1
2
3
4
5

D) char a[5]={0,1,2,3,4,5};
E0146 初始值设定项值太多

数组取数问题

若有语句int array[3][4];以下对下标为i和j的数组元素的引用不正确的是 。
A) array[i][j] B) ((array+i)+j) C) *(array[i]+j) D) (array+i4+j)

/*
	    1, 2, 3, 4
		5, 6, 7, 8
		9,10,11,12 
	*/
	int array[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
	int i = 1, j = 1;
	printf("%d\n", array[i][j]);
	printf("%d\n", *(*(array + i) + j));
	printf("%d\n", *(array[i] + j));
	printf("%d\n", *(array + i * 4 + j));
	/*
	6
    6
    6
    10287900
	*/

(*p)++和 *(p++)和*p++的区别

例如

int arr[5] = { 1,3,5,7,9 };
int *p = arr;
*++p:p先自+,然后*p,最终为3
++*p:先*p,即arr[0]=1,然后再++,最终为2
*p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
(*p)++:先*p,即arr[0]=1,然后1++,该语句执行完毕后arr[0] =2
*(p++):效果等同于*p++

再例如

    const char* a[2] = { "one", "two" }, **p = a;
	printf("the result of *p is : %s\n", *p);
	printf("the result of **p is : %c\n", **p);
	printf("the result of (*p)++ is : %s\n", (*p)++);
	printf("the result of *(p+1) is : %s\n", *(p+1));
	printf("the result of *p+1 is : %s\n", *p + 1);
	//(1) *p + 1
	//(2) p++
	//printf("the result of *(p++) + 1 is : %s,", *(p++) + 1);
	printf("the result of *(++p) + 1 is : %s,", *(++p) + 1);
	printf("the result of **p-1 is : %c\n", **p-1);    

结构体和枚举

1

  • 题目
    在这里插入图片描述
  • 解析
#include <stdio.h>
#include <iostream>
using namespace std;

enum color 
{ 
	red, yellow, blue = 4, green, white 
}c1;


int main()
{
	c1 = red;
	printf("%d", c1);
	c1 = yellow;
	printf("%d", c1);

	c1 = blue;
	printf("%d", c1);

	c1 = green;
	printf("%d", c1);

	c1 = white;
	printf("%d", c1);

	cin.get();
	return 0;
}

输出结果

01456
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值