Some essential problems in C

本文解析了C语言中常见的九大问题,包括字节对齐、原码与补码、switch语句、位运算等,通过具体示例帮助读者理解这些易错点。

Here are some points that you may often meet when using c language. They are not difficult but they are error-prone. These issues are collected from my job interview and I am willing to share with you. 


[1] 字节对齐问题
[2] 原码与补码问题。
[3] switch语句问题。
[4] 位运算问题。
[5] 宏定义问题。
[6] 二维数组问题。
[7] 计算字符串长度问题。
[8] 大小端表示与字节序问题。
[9] 溢出问题。


[1] 字节对齐问题。在32位系统下,用VC6默认输出的结果如下:

 

[题目扩展]
自己设定字节对齐,方法如下:

  

[2] 原码与补码问题。

 

[分析]
此题主要考查负数在内存中是按补码形式存放的。
chr=127, chr+1: 1000 0000, 最高位为1说明是负数,那么求原码,方法减一取反得: 1000 0000, 所以表示-128, 那么sum=sum+chr=200+(-128)=72


[题目扩展] // 此题目有问题!
若码值FFH是一个整数的原码表示,则该整数的真值为多少?

[分析]
若在32位系统中用int类型(4B)保存此整数,则该整数的真值为0000 .... 0000 1111 1111=255
若用1B有符号类型变量来保存此整数,则次数在内存中为:1111 1111,说明为负数,那么求原码,方法减一取反得:0000 0001,那么其真值为-1 

[3] switch语句问题。

 

 [分析]
了解switch语句的执行流程,在写代码的时候,要养成在每一个case分支语句末尾添加break语句。

[4] 位运算问题。

[分析]
要熟悉左/右移运算符,左移等价于*2,而右移等价于/2

[5] 宏定义问题。

[分析]
考查宏展开,语句(float)(DIV(ivar1*ivar2,ivar1-ivar2) / 2)相当于如下:

(float)( ivar1*ivar2/ivar1-ivar2/2 );即,(float)(7*5/7-5/2)=(float)(5-2)=3.0

[6] 二维数组问题。

设计select函数:在N行M列的二维数组中,选出一个最大值作为函数值返回,并通过形参传回此最大值所在的行下标。

[题目扩展] 

 

[7] 计算字符串长度问题。

 

[8] 大小端表示与字节序问题。

[分析]
一般intel系列的CPU是采用的Little-Endian的格式存放数据,即低位字节放在内存的低地址端

[9] 溢出问题。

   


<think>我们正在解决Ubuntu上使用apt-get安装build-essential时出现的依赖问题。根据引用[2]和引用[3]提供的信息,我们可以采取以下步骤: 步骤1:尝试移除可能导致问题的包`libdpkg-perl`(引用[2]的方法) ```bash sudo apt-get remove libdpkg-perl ``` 步骤2:重新安装`libdpkg-perl` ```bash sudo apt-get install libdpkg-perl ``` 步骤3:再次尝试安装build-essential ```bash sudo apt-get install build-essential ``` 如果上述方法无效,可以考虑使用aptitude工具(引用[3]中提到)。aptitude是一个更高级的包管理工具,能更好地处理依赖关系。 步骤4(可选方法):安装aptitude并尝试用它安装build-essential ```bash sudo apt-get install aptitude sudo aptitude install build-essential ``` 在aptitude的交互界面中,它会提供解决方案来处理依赖冲突,通常选择第一个解决方案(按数字键1)即可。 另外,在尝试上述操作之前,建议先更新软件包列表,以确保获取最新的包信息: ```bash sudo apt-get update ``` 如果遇到其他错误,请检查错误信息并搜索相关解决方案。有时,修复损坏的包或依赖关系也是必要的: ```bash sudo apt-get -f install sudo apt-get autoremove sudo apt-get autoclean ``` 总结:优先尝试引用[2]的方法,如果不行再尝试使用aptitude(引用[3])。 §§相关问题§§ 1. 如何解决Ubuntu中常见的软件包依赖问题? 2. 除了build-essential,在Ubuntu上开发C/C++程序还需要安装哪些工具? 3. 如何清理Ubuntu系统中不再需要的依赖包和缓存?</think>### Ubuntu apt-get install build-essential 依赖问题解决方法 在Ubuntu上安装`build-essential`时遇到依赖问题,通常是由于软件包依赖关系损坏或冲突导致的。以下是系统性的解决方法: #### 1. **更新软件包列表(推荐优先尝试)** ```bash sudo apt-get update sudo apt-get upgrade ``` 更新系统后再次尝试安装: ```bash sudo apt-get install build-essential ``` #### 2. **修复损坏的依赖关系(关键步骤)** ```bash sudo apt-get -f install # 修复依赖中断 sudo apt-get autoremove # 移除无用包 sudo dpkg --configure -a # 修复未完成的配置 ``` #### 3. **处理特定冲突包(参考引用[2])** 当出现`libdpkg-perl`相关错误时: ```bash sudo apt-get remove libdpkg-perl sudo apt-get install libdpkg-perl sudo apt-get install build-essential ``` #### 4. **使用aptitude工具(参考引用[3])** ```bash sudo apt-get install aptitude # 安装高级包管理工具 sudo aptitude install build-essential ``` 在交互界面中: 1. 按`n`查看解决方案 2. 选择合理的依赖解决方案(通常选第一个) 3. 按`g`应用方案并确认 #### 5. **清除缓存后重试** ```bash sudo apt-get clean sudo apt autoclean sudo rm -rf /var/lib/apt/lists/* sudo apt-get update sudo apt-get install build-essential ``` #### 6. **手动下载安装(终极方案)** ```bash cd /tmp sudo apt-get download build-essential $(apt-cache depends build-essential | grep Depends | cut -d: -f2) sudo dpkg -i *.deb ``` > **重要提示**:执行上述操作后建议重启系统:`sudo reboot`
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值