C的缺陷和陷阱读书笔记

news2024/12/29 14:17:39

词法陷阱

1、if语句的特殊用法

1、if(x>max) max=x;

2、if(x>max?x;max)  //条件表达式,是执行第二个,否执行第三个

3、if(x>max);  //条件成立后执行——空语句

4、if((f=open(arg v[i],0))>0)  //open函数执行,成功返回后面的0(或者正数),执行失败则 返回-1

//代码通过对open的执行结果赋值然后判断是否>0,来判断open函数执行是否成功

2、符号的贪心法

C语言的运算字符分为单字字符和多字字符,当有一串运算字符相连的时候——从第一个开始尽可能多的连接字符串,看连接起来的字符是否含有意义,直到多加一个就不会有意义的时候停止

1、a---b  //(a--)-b

2、a-----b  //(a--)-(--b)

3、八进制的表示

  • 书面表示——(123)8、123o
  • 计算机表示——0123、/123

所以在计算机编程中,切记不能为了将数值对齐而把十进制123写为0123

4、字符与字符串

单引号引起一个字符的实质 —— 代表了一个整数

双引号引起的字符串的实质 —— 代表了一个指向无名数组的起始字符串的指针,该数组初始化为双引号之间的内容加 \0

指针——即内存地址,指针变量即用来存放指针的变量,有自己的内存编号和内存空间

5、条件运算符

可以直接作为一句代码写在文件里面,而不是非要与if语句组合才可以

ch = (ch > 'A' && ch < 'Z') ? (ch + 32): ch;

语法陷阱

1、首地址相关

指针指向首地址,指针变量是存储目标首地址的变量

取地址取到的是首地址,解引用得到的是首地址

2、运算符的优先级

优先级顺序:初等运算符>单目运算符>算术运算符>关系运算符>逻辑运算符>条件运算符>赋值运算符>逗号运算符

初等运算符包括圆括号()、下标运算符[ ]、结构体成员运算符->

运算符的结合性:单目运算符、条件运算符、赋值运算符及其扩展运算符,结合方向都是从右到左,其余的运算符都是从左到右

d511b0e8b602453080beb8489f0aa917.png

常见的优先级

  • && 优先于 ||
  • & 优先于 ^ 优先于 |
  • <、> 优先级于 == 和 !=
  • * 优先于 ++、--
  • +、-、*、/  优先于 <<
  • != 优先于 &

 

*p() 函数指针,要调用指针变量所指向的函数要使用 (*p)()

逗号表达式在只能返回一个结果或者只能有一个参数的时候:顺序计算,但只使用最后一个表达式的值;除此外都是顺序计算

3、switch语句

switch…case语句,case的值必须是整数或者 'a' 类的字符(单引号引起来的字符实质上是一个ASCII码对应的数字),在没有循环跳出语句的情况下,只要进入某一个入口,将不会对后面的入口条件进行判别,而会直接执行对应的语句

4、else语句的悬挂

else和if语句总是配对出现且是最短配对

语义陷阱

1、指针

  • 两指针变量的赋值,赋给目标的首地址,使用任何一个指针变量修改都会影响到目标
  • 给指针加一个整数就会跳到下一个存储单元,如果存储的是int,一次跳四个字节
  • 两指针指向的是同一个数组中的元素,指针相减的话得到两个指针的距离
  • 指针可以自增p++

2、数组

把数组作为参数传给一个函数的时候本质上传递的是该数组的首地址

只出现数组名时——本质是该数组的首地址

可加偏移量解引用取得偏移后的地址————n维数组可经过n次加偏移后的解引用

数组的初始化有以下几种方法

  • 直接初始化 (完全初始化)
    int arr[5] = {1, 2, 3, 4, 5};
    char arr[5]={"hello"};  或者 char arr[5]="hello";
  • 不完全初始化——后面的内容如果为0,可在标明数组长度的情况下,省略后面的0
    int arr[] = {1, 2, 3, 4, 5};
    ​
    int arr[10] = {1, 2};   //未初始化的部分为0
  • 遍历初始化
    int array[10];
    for(int i=0;i<10;i++)
        array[i]=0;
  • 集成初始化                              C99标准中规定数组长度可以为变量
    int array[i] = { [0]=0,[5]=10,[10]=23 };
    
    const int number=10;
    int array[number]={0};
    /*C99标准中规定数组长度可以为变量,即number*/
  • 动态初始化——此处使用的常变量可以做到一改全改,很方便(符号常量也有这个好处)
    int array[i] = { [0]=0,[5]=10,[10]=23 };
    
    const int number=10;
    int array[number]={0};
    /*C99标准中规定数组长度可以为变量,即number*/

3、sizeof和strlen

sizeof用于计算字符串的大小,包括后面的\0

strlen只计算有用的字符的个数,不包括\0,使用strlen计算的存储空间应为n+1

4、内存分配

malloc函数分配内存空间会沿着空闲链表找一个没用过的内存块

  • 函数的定义下的返回值为void*,所以使用的时候,应当强制转化其返回类型
  • 如果分配的内存小于使用的内存,就会顺序占用接下来的内存空间,该内存空间的值就会被清除
  • 不是用这块内存空间的时候要使用free函数释放该内存空间——因为此时的内存空间的占用为显式的内存分配,所以要使用函数显式的释放内存——不像局部变量属于是隐式的分配内存,故而释放内存的时候也是隐式的释放

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1152580.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Maven系列第9篇:多环境构建,作为核心开发,这个玩不转有点说不过去!

如果你作为公司核心开发&#xff0c;打算使用maven来搭建项目骨架&#xff0c;这篇文章的内容是你必须要掌握的。 平时我们在开发系统的时候&#xff0c;会有开发环境、测试环境、线上环境&#xff0c;每个环境中配置文件可能都是不一样的&#xff0c;比如&#xff1a;数据库的…

Matlab2022b图文安装保姆级教程

注意&#xff1a;完成安装步骤1和步骤2之后&#xff0c;再去使用Matlab2022b 本次安装后的版本信息如下&#xff0c;64位软件&#xff0c;windows系统 Matlab2022a与2022b的比较 MATLAB主要用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险…

宝塔Linux面板Java项目前后端部署 (PHP部署前端文件)

1. 上传前端文件 将整个文件夹拖进来 2. PHP项目 (添加站点) 添加证书SSL 新增配置文件 location /dev-api/{proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header REMOTE-HOST $remote_addr;proxy_set_header X-Forwarded-For $proxy_…

Multi-gpu问题(1)

Multi-gpu问题 域在z方向划分为num_gpus段&#xff0c;其中num_gpus表示可用GPU的数量&#xff0c;然后每个GPU相应地负责一个大小为nxny&#xff08;nz/num_gpus&#xff09;的子域。 虽然整个域在主机端表示&#xff0c;但gpu只存储它们的子域。由于更新GPU k&#xff08;k …

【计算机网络笔记】传输层——UDP简介

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

安防监控项目---web点灯(网页发送命令控制A9的led)

文章目录 前言一、web点亮LED流程二、静态网页设计&#xff08;html界面&#xff09;三、 CGI和BOA在本项目中的使用总结 前言 书接上期&#xff0c;和大家分享的是web点灯&#xff0c;哈哈哈&#xff0c;谈论起点灯这个词&#xff0c;这么久以来我已然已经成长为一名合格的点…

C#,数值计算——分类与推理Svmpolykernel的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { public class Svmpolykernel : Svmgenkernel { public int n { get; set; } public double a { get; set; } public double b { get; set; } public double d { get; set; …

gRPC源码剖析-Builder模式

一、Builder模式 1、定义 将一个复杂对象的构建与表示分离&#xff0c;使得同样的构建过程可以创建不同的的表示。 2、适用场景 当创建复杂对象的算法应独立于该对象的组成部分以及它们的装配方式时。 当构造过程必须允许被构造的对象有不同的表示时。 说人话&#xff1a…

java之数组的定义以及使用

文章目录 定义数组1. 定义数组并分配内存空间&#xff1a;2. 定义并初始化数组的值&#xff1a;3. 动态初始化数组&#xff1a;4. 使用数组长度属性&#xff1a;5. 多维数组的定义&#xff1a; 数组的应用数组赋值&#xff1a;1. 直接赋值&#xff1a;直接初始化数组&#xff1…

多线程---synchronized特性+原理

文章目录 synchronized特性synchronized原理锁升级/锁膨胀锁消除锁粗化 synchronized特性 互斥 当某个线程执行到某个对象的synchronized中时&#xff0c;其他线程如果也执行到同一个对象的synchronized就会阻塞等待。 进入synchronized修饰的代码块相当于加锁 退出synchronize…

【UE 模型描边】UE5中给模型描边 数字孪生 智慧城市领域 提供资源下载

目录 0 引言1 Soft Outlines1.1 虚幻商城1.2 使用步骤 2 Auto Mesh Outlines2.1 虚幻商城2.2 使用步骤 3 Survivor Vision3.1 虚幻商城3.2 使用步骤 结尾 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;UE虚幻引擎专栏&#x1f4a5; 标题&#xf…

设计模式_状态模式

状态模式 介绍 设计模式定义案例问题堆积在哪里解决办法状态模式一个对象 状态可以发生改变 不同的状态又有不同的行为逻辑游戏角色 加载不同的技能 每个技能有不同的&#xff1a;攻击逻辑 攻击范围 动作等等1 状态很多 2 每个状态有自己的属性和逻辑每种状态单独写一个类 角色…

一个注解,实现数据脱敏-plus版

shigen坚持日更的博客写手&#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。坚持记录和分享从业两年以来的技术积累和思考&#xff0c;不断沉淀和成长。 当看到这个文章名的时候&#xff0c;是不是很熟悉&#xff0c;是的shigen之前发表了一个这…

[C++]命名空间等——喵喵要吃C嘎嘎

希望你开心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你点赞&#xff01; 最后的最后&#xff0c;关注喵&#xff0c;关注喵&#xff0c;关注喵&#xff0c;大大会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的…

CSRF 篇

一、CSRF 漏洞&#xff1a; 1、漏洞概述&#xff1a; &#xff08;1&#xff09;一般情景&#xff1a; 利用已认证用户的身份执行未经用户授权的操作。攻击者试图欺骗用户在其不知情的情况下执行某些操作&#xff0c;通常是在受害者已经登录到特定网站的情况下。 &#xff0…

《动手深度学习》线性回归简洁实现实例

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

百度富文本上传图片后样式崩塌

&#x1f525;博客主页&#xff1a; 破浪前进 &#x1f516;系列专栏&#xff1a; Vue、React、PHP ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 问题描述&#xff1a;上传图片后&#xff0c;图片会变得很大&#xff0c;当点击的时候更是会顶开整个的容器的高跟宽 原因&#…

【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割7(数据预处理)

在上一节&#xff1a;【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割6&#xff08;数据预处理&#xff09; 中&#xff0c;我们已经得到了与mhd图像同seriesUID名称的mask nrrd数据文件了&#xff0c;可以说是一一对应了。 并且&#xff0c;mask的文件&#xff0c;还根据结…

【错误解决方案】ModuleNotFoundError: No module named ‘ngboost‘

1. 错误提示 在python程序&#xff0c;尝试导入一个名为ngboost的模块&#xff0c;但Python提示找不到这个模块。 错误提示&#xff1a;ModuleNotFoundError: No module named ‘ngboost‘ 2. 解决方案 出现上述问题&#xff0c;可能是因为你还没有安装这个模块&#xff0c;…

CXL技术交流群问题讨论记录(1)

&#x1f525;点击查看精选 CXL 系列文章&#x1f525; &#x1f4e2; 声明&#xff1a; &#x1f96d; 作者主页&#xff1a;【MangoPapa的CSDN主页】。⚠️ 本文首发于CSDN&#xff0c;转载或引用请注明出处【https://mangopapa.blog.csdn.net/article/details/134131924】。…