C语言书籍——A/陷阱之处

这篇具有很好参考价值的文章主要介绍了C语言书籍——A/陷阱之处。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

文章参考于文献:《C陷阱与缺陷》[美]Andrew Koening

 C语言书籍——A/陷阱之处,C语言练习,c语言,开发语言

🌈个人主页:慢了半拍

🔥 创作专栏:《史上最强算法分析》 | 《无味生》 |《史上最强C语言讲解》 | 《史上最强C练习解析》

🏆我的格言:一切只是时间问题。 

C语言书籍——A/陷阱之处,C语言练习,c语言,开发语言

C语言书籍——A/陷阱之处,C语言练习,c语言,开发语言

目录

词法陷阱 

一、= 不同于 ==

二、& 和 | 不同于 && 和 ||

三、词法分析中的“ 贪心法 ”

四、整型常量

五、字符与字符串

语法陷阱

一、理解函数声明

二、运算符的优先级问题

三、注意作为语句结束标志的分号

四、swith语句

五、函数调用

六、“悬挂”else引发的问题

语义陷阱

一、指针与数组

二、非数组的指针

三、作为参数的数组声明

四、避免“ 举隅法 ”

五、空指针并非空字符串

六、边界计算与不对称计算

七、求职顺序

八、逻辑运算符&&、| 和 !

九、整数溢出

十、为函数main提供返回值


词法陷阱 

一、= 不同于 ==

在 if 判断时容易出错。

=:赋值运算,a=3;表示的是将3赋值给a变量。
==:比较运算,a==3;表示判断a是否等于3,若等于则返回1,否则返回0。

二、& 和 | 不同于 && 和 ||

这是两个 逻辑操作符与位操作符的区别。

详见《逻辑操作符》与《位操作符》

三、词法分析中的“ 贪心法 ”

a---b;等于a-- -b;  //先a-b,再a--
不等于a- --b;  //--b先做自减运算,再a-b

C语言书籍——A/陷阱之处,C语言练习,c语言,开发语言

四、整型常量

如果一个整型常量的第一个数字是0,则该常量会被当做是八进制数,因此10和010代表是分别是十进制的10和十进制的8。

五、字符与字符串

单引号引起来的字符代表的是该字符的ASCII码值

双引号引起来的字符串代表的是一个指向无名数组的起始字符的指针,该数组被双引号之间的字符以及一个额外’\0’(字符串标志)初始化。

在双引号引起来的字符串中,注释符号/*属于字符串的一部分;在注释中出现的双引号“”又属于注释的一部分。

因此,语句:printf("The world") 和以下语句是等价的:

char str[]= {'T','h','e',' ','w', 'o','r','l','d','\n'};
printf(str);

语法陷阱

一、理解函数声明

指针例题

二、运算符的优先级问题

详见 优先级

三、注意作为语句结束标志的分号

//代码1
if(x[i] > b);
	b = x[i];
//代码2
if(x[i] > b){}
	b = x[i];

//代码3
if(x[i] > b)
	b = x[i];

一个分号就代表一个语句的结束。代码1与代码2是等价,if和赋值语句是两个独立的语句;而第三句中赋值语句在if中。

四、swith语句

语句详解

五、函数调用

C语言要求:在函数调用时即使函数不带参数也应该包括参数列表。因此,如果f是一个函数,

f();

是一个函数调用语句。


f;

却是一个什么也不做的语句。更精确地说,这个语句计算函数f的地址,却并不调用该函数。

六、“悬挂”else引发的问题

if (x == 0)
		if (y == 0) error();
	else {
			Z = X + Y;
			f(&z);
		 }

 两种解读:

解读一:

if (x == 0) 
{
	if (y == 0) error();
	else 
	{
		Z = X + Y;
		f(&z);
	}
}

 解读二:

if (x == 0)
{
	if (y == 0) error();
}
	else
	{
		Z = X + Y;
		f(&z);
	}

语义陷阱

一、指针与数组

深入理解指针系列文章

二、非数组的指针

三、作为参数的数组声明

四、避免“ 举隅法 ”

常见错误解释:避免以整体代表部分,或者以部分代表整体。

常见错误:混淆指针与指针所指向的数据。

char *p,*q;
p ="xyz";

上面的赋值语句使得p的值就是字符串"xyz",然而实际情况并不是这样,实际上,p的值是一个指向由'x'、'y'、’z"和\0 4个字符组成的数组的起始元素的指针。

因此,如果我们执行下面的语句:q=p;

p和q现在是两个指向内存中同一地址的指针,但这个赋值语句并没有同时复制内存中的字符。

C语言书籍——A/陷阱之处,C语言练习,c语言,开发语言

复制指针并不同时复制指针所指向的数据,因此,当我们执行完下面的语句之后:q[1]='y';q所指向的内存现在存储的是字符串'xyz’。因为p和q所指向的是同一块内存,所以p指向的内存中存储的当然也是字符串’xyz'。

五、空指针并非空字符串

在C语言中将一个整数转换为一个指针,最后得到的结果都取决于具体的C编译器实现。这个特殊情况就是常数0,编译器保证由0转换而来的指针不等于任何有效的指针。

出于代码文档化的考虑,常数0这个值经常用一个符号来代替:#define NULL 0

当然无论是直接用常数0,还是用符号ULL,效果都是相同的。

需要记住的重要一点是,当常数0被转换为指针使用时,这个指针绝对不能被解除引用(dereference)。换句话说,当我们将0赋值给一个指针变量时,绝对不能企图使用该指针所指向的内存中存储的内容。

合法格式:

if(p == (char *) 0)

非法格式:

if(strcmp(p,(char*)0) == 0)

原因在于库函数 strcmp 的实现中会包括查看它的指针参数所指向内存中的内容的操作。

六、边界计算与不对称计算

七、求职顺序

八、逻辑运算符&&、| 和 !

九、整数溢出

C语言中存在两类整数算术运算,有符号运算与无符号运算。

1、两个无符号算术运算中,没有所谓的“溢出”一说:所有的无符号运算都是以2的n次方为模,这里n是结果中的位数。

2、一个操作数是有符号整数,另一个是无符号整数,那么有符号整数会被转换为无符号整数,“溢出”也不可能发生。

3、当两个操作数都是有符号整数时,“溢出”就有可能发生,而且“溢出”的结果是术定义的。当一个运算的结果发生“溢出”时,作出任何假设都是不安全的。

正确的方式是将a和b都强制转换为无符号整数:

if ((unsigned)a + (unsigned)b > INT_MAX)
		complain();

此处的 INT_MAX是一个已定义常量,代表可能的最大整数值。ANSIC标准在<limits.h>中定义了INTMAX:如果是在其他C语言实现上,读者也许需要自己重新定义。

//不需要用到无符号算术运算的另一种可行方法是:
if(a >INT_MAX - b)
    complain();

十、为函数main提供返回值

C语言书籍——A/陷阱之处,C语言练习,c语言,开发语言

函数 main 与其他任何函数一样,如果并未显式声明返回类型,那么函数返回类型就默认为是整型。但是这个程序中并没有给出任何返回值。

通常说来,这不会造成什么危害。一个返回值为整型的函数如果返回失败,实际上是隐含地返回了某个“垃圾”整数。只要该数值不被用到,就无关紧要。

严格说来,我们前面的最简单的C程序应该像下面这样编写代码:文章来源地址https://www.toymoban.com/news/detail-838851.html

int main()
{
	//语句

	return 0;
}

到了这里,关于C语言书籍——A/陷阱之处的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ChatGPT和其他自然语言处理模型有什么不同之处?

    ChatGPT是一种基于变压器神经网络的自然语言生成模型,与传统的语言模型和其他自然语言处理模型相比,具有以下几个显著的不同之处: 1.能够生成连贯、长文本 传统的语言模型(如N-gram模型)通常只能生成短文本,而生成长文本时容易出现重复或不连贯的情况。而ChatGPT使

    2024年02月11日
    浏览(46)
  • 【JAVA】数据类型与变量(主要学习与c语言不同之处)

    ✅作者简介:大家好,我是橘橙黄又青,一个想要与大家共同进步的男人😉😉 🍎个人主页:橘橙黄又青-CSDN博客 目标: 1. 字面常量 2. 数据类型 3. 变量 在上节课 HelloWorld 程序中, System.Out.println(\\\"Hello World\\\") ; 语句,不论程序何时运行,输出的都是 Hello World,其实 \\\"Hello Wo

    2024年03月28日
    浏览(48)
  • ARM-Linux开发与MCU开发的不同之处分析

    目录 一、ARM-Linux应用开发和单片机开发的不同 二、Arm-Linux基本开发环境 针对ARM-Linux程序的开发,主要分为三类:应用程序开发、驱动程序开发、系统内核开发。针对不同种类的软件开发,有其不同的特点。 今天,我们来看看ARM-Linux开发和MCU开发的不同点,以及ARM-Linux的基本

    2024年02月10日
    浏览(49)
  • Web2与Web3开发的不同之处

    Web2是引入交互功能的第二代互联网,也是我们今天所熟悉的。随着Web的不断发展,第三代互联网,也被称为Web3,正处于积极开发中。Web3引入了在区块链上运行的去中心化和无需许可的系统。但是Web2和Web3开发之间有什么区别呢?这对于从Web2转变到Web3的开发者是个契机,不仅

    2024年02月05日
    浏览(44)
  • Ruby语言入门书籍推荐(10本)

    1.《Ruby基础教程(第4版)》 《Ruby基础教程(第4版)》是一本非常适合初学者入门的Ruby语言书籍,作者Matz和 Keiju Ishitsuka。本书由浅入深地介绍了Ruby的基础语法和常用库,包括字符串、数组、哈希表等,同时也覆盖了函数、类和模块等高级概念。读者可以轻松地掌握Ruby的基本语法

    2024年02月11日
    浏览(50)
  • Go语言入门书籍推荐(10本)

    1. 《Go 语言编程》 《Go 语言编程》是由图灵教育编写的一本入门教程,全书共分为 18 章,包括 Go 语言基础、流程控制、函数、数组切片、指针、结构体和面向对象编程等内容。通过这本书,读者可以系统地了解 Go 语言的基础知识,掌握基本的编程技能。 2. 《Go 语言实战》

    2024年02月12日
    浏览(44)
  • R语言初学者书籍推荐

    Home | Bookdown 这个网站上有很多R语言的书籍,并且一直在更新,阅读起来没有难度。 今天搜索材料的时候,检索到下面这本书:  有输入,才会有输出。 《R包开发(2ed)》 2rd的未出版的中文翻译版:https://r-packages-zh-cn.readthedocs.io/zh_CN/latest/index.html#  英文版本:R Packages (2e

    2024年02月13日
    浏览(39)
  • Bash语言介绍并推荐入门书籍(10本)

    Bash(Bourne Again SHell)是一种命令行解释器和脚本语言,常用于Unix和Linux系统。它是Bourne shell的改进版本,也是最常用的shell之一。Bash具有执行命令、处理文本和实现脚本编程等功能。 Bash可用于直接在命令行输入命令,也可用于编写脚本文件以自动化任务。脚本文件通常以

    2024年02月11日
    浏览(49)
  • R语言介绍并推荐入门书籍(15本)

    R语言是一种开源的编程语言和环境,主要用于统计分析、数据可视化和数据科学领域。它提供了丰富的统计和图形工具,可以对数据进行整理、分析和可视化,并能够进行复杂的统计建模和机器学习算法实现。R语言具有以下特点: 1. 开源免费:R语言是开源软件,用户可以免

    2024年02月12日
    浏览(41)
  • 球从楼梯弹起的数学原理 用数学建模运动的美妙之处(教程含R语言源码)

    我最近解决了这个应用数学问题,并对答案的美妙感到非常高兴,所以我想我会分享我的解决方法。 该问题涉及一个粒子从楼梯顶部发射并逐渐向下弹跳,撞击每个台阶一次。这是我们在日常生活中见过的经典动作,因此用数学对其进行建模是一项有趣的挑战。当然,我们将

    2024年02月02日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包