C 语言避坑指南

news/2024/5/4 6:08:12/文章来源:https://blog.csdn.net/runofsun/article/details/126575750

文章目录

    •   👉引言💎
  • C 避坑指南
    • 一、基础|基本常识类
        • 1 运算符类型
        • 2 占位符|格式化问题
        • 3 输入输出问题
    • 二、错题 | 程序语句类
    • 三、进阶 | 指针与函数
    • 四、进阶 | 结构体及宏定义

  👉引言💎

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。
热爱写作,愿意让自己成为更好的人…


在这里插入图片描述

铭记于心
🎉✨🎉我唯一知道的,便是我一无所知🎉✨🎉

C 避坑指南

一、基础|基本常识类

  • 注意逻辑运算符的短路效应

  • else只跟最近的if相匹配

  • c语言本身不提供输入输出语句,靠标准函数库实现

  • putchar 输出的是字符,,c语言函数内部 不能够嵌套定义 函数

  • 存储类型 有 auto ,static , register(寄存器) , extern(外部),全局变量默认为 static

  • 未指定存储类别的变量,其隐含的存储类别为 auto

1 运算符类型

  • 对于%,需要%%才能转义,而不是\

  • 逗号运算符优先级最低,整个逗号表达式的值就是 最右边表达式的值

在这里插入图片描述

在这里插入图片描述

  • char类型对于字符串会取最低位字符

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gxaKGM9P-1661697614551)(image/image_kWF-MBinZ7.png)]

  • 这个就是 每个字符占一个字节,int4个字节,被赋值’328’后,每个字节位置则是 0 51 50 56, 换成二进制后再转换为int即为3355192

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VWRroyGa-1661697614551)(image/image_57RktaQnfx.png)]

  • 只是逗号表达式返回最右边的值,执行还是从左到右

在这里插入图片描述

  • a+=a-=a*a;C中为-4 ,java中为0

    易知Java中对同一变量连续赋值,JVM虚拟机运行结果与c【-8 7 3】不同,而这种写法在python中是不被允许的

在这里插入图片描述

2 占位符|格式化问题

需要注意的是 2 转义字符的使用事项:

  • %5.2s 指输出字符串前2位,占5个空间,右对齐 %d 是忽略并丢弃一个整型字符

  • #的作用 是输出提示(0, 0x)

  • 注意对 char类型赋值时一定看清楚是 数字还是字符,6与’6’是完全不同的

  • %d%i只在scanf时有区别,且前者 只匹配十进制,不匹配的都输出0,后者据情况判断(0x十六进制,0八进制)转10进制

    不匹配直接搞成0

在这里插入图片描述

  • m.n中 m是宽度,负号表示左对齐;n是(具体跟 后面的 d(至少输出的位数) , s(输出的位数) ,f(输出的精度)有关

    不满足则 用0补齐,高位补0,想想也确实应该 [其实一般用于浮点型]

在这里插入图片描述

  • 如果是%5d 的话则输出 [空格]-123 其实这些 都是符合逻辑的,因为 总不能 下面输出0-123吧,这也不合适

在这里插入图片描述

  • 关于 字符串的输出格式化,字符串位数小于“精度”则输出全部字符串,其它不用管,,大于,则只取“精度”规定的前几个字符

    在这里插入图片描述

在这里插入图片描述

  • 对于%d来讲,4代表控制精度为4位,所以高位补0;5代表 设置宽度,所以靠右对齐,共占五个宽度

在这里插入图片描述

3 输入输出问题

  • sprintf(const char * str …),后面跟printf用法一样,就多了一个指定输出位置str

  • printf与scanf返回值都是由 输出输入字符数量决定

  • scanf(读取时的格式符不能带 .n这样是无效的,也就是只能是 %3d(读取三位有效数字), 而不能%3.2d),且输入时如果不加 输入项,则会抛出运行时异常,而printf(“dadw%d”)没有输出项也不会报异常

  • 注意如果是 scanf(“%c\n”),则输入一个字符回车会陷入死循环,因为回车(空白字符)不会被scanf读取,但是还没有读取\n,也就是他会一直去“读\n”,除非再输入一个 非空白字符

在这里插入图片描述

  • 包括 lf,f格式字符都是默认输出 小数点后六位(超过则四舍五入),但%g可以将无效位数去掉,只输出有效位

在这里插入图片描述

  • getchar( 出错返回-1)

在这里插入图片描述

二、错题 | 程序语句类

  • 1 对于 while(b- -≥0)一定注意,最后b出来的时候是-2,一定要注意这个问题

  • 2

    int s = (b = ++m * m++, --m + b--) + ++b +b--; //相当于b = ++m * m++; s = ( --m + b--) + ++b +b--;
    后置++是此运算式子中都不变,运算结束自加(逗号符可以看做结束运算),比如这个m自+后当时是m,但后来m就是m+1int s = m + m * (m++) * m;

    ,而不是语句

在这里插入图片描述

在这里插入图片描述

  • 3

在这里插入图片描述

  • 4 虽然符合c11标准,但各家编译器对其扩展定义不同,比如dev允许变长数组(变长数组不能在定义时初始化),但vs中不允许

在这里插入图片描述

  • 5

在这里插入图片描述

  • 6
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

三、进阶 | 指针与函数

scanf(),getchar(),getche(),getch()这些函数缓冲区角度的解释

字符串常量

  1. 相当于 *p = *p+6

    在这里插入图片描述

  2. 不能这样给字符数组赋值,另外,上面哪一行在vs中需要加const修饰(指向字符常量)

在这里插入图片描述

  1. 函数指针

    int (*t)(int a, int b);
    两种调用方式都是可以的(*t)(2, 1);t(2,1)
    
  2. 数组名是一个地址,也就是一个指针,但不能说是指针变量(不可变),,指针变量的值是一个地址

  3. *p=*q 解引用当左值时是变量,右值时是常量

  4. 二维数组传参时局部变量不能用 二级指针,而用数组形式,因为需要指定 一维容量,即 void test(int nums[ ][5] );,字符数组亦是如此

  5. 对于数组无法自增,但可以再用个指针指向该数组进行自增移动

    P是一个数组指针,指向空间大小为4的数组

  6. printf()多元素输出的时候,存在入栈(同时进行运算),出栈问题,一定注意

  7. strcpy会连 \0结束符 一起复制过去 而strncpy(char *dest, const char *src, size_t len)并不会负责添加‘\0’(在字符串长度大于len的情况下,如果小于则会用NULL(\0)填满)

  8. 接收含有空格的字符串直接用 gets(str),输出可以puts(str)【且自动换行】

四、进阶 | 结构体及宏定义

  1. 结构体长度的计算

    union的使用受系统大小端的影响

    栈的生长方向与内存存放规则

    低地址存低位数据
    大端模式,低地址存高位数据

在这里插入图片描述

    int check_cpu(){union{short a;char b;}c;c.a=1;return c.b == 1;}小端返回1
   enum s------------------------------izes { small=7,medium,large=10,humungous };       默认情况下,整型值从0开始。如果对列表中的某个标识符进行了赋值,那么紧接其后的那个标识符的值就比所赋的值大1,然后类推

在这里插入图片描述
在这里插入图片描述

3.

  • 宏定义是用宏名代替一个字符串,也就是做简单的置换,不做正确性检查。(预编译时不做任何语法检查,只有在编译已被宏展开后的源程序时才会发现语法错误并报错)

  • 宏定义不是C语句,不必在行末加分号,不是c语言本身组成部分。如果加了分号则会连分号一起进行替换

  • #definde出现在A处,则宏名的有效范围为定义命令之后到本源文件之后到本源文件结尾。

  • 可以通过#undef命令终止宏定义的作用域

  • c语言不做const char*修饰以及越界检查,并且如果是cpp,那么检不检查也与编译器有关,比如vs2022检查,dev照样不检查

  • memchr()如果找数字0,则会返回任意地址,因为它会认为0是NULL

🌹写在最后💖
路漫漫其修远兮,吾将上下而求索!伙伴们,再见!🌹🌹🌹在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux 中 date +%s 获取1970年以来的秒数

001、(base) [root@PC1 home]# date +%s 1663810406 (base) [root@PC1 home]# date +%s 1663810410 date +%s //从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数(时间戳)参考:https://zhidao.baidu.com/question/490735500497375812.html

EasyCVR接入宇视设备后通道显示的是目录,是什么原因?

EasyCVR平台基于云边端一体化架构,充分发挥视频接入、汇聚与管理、分发、智能分析、数据共享等能力,不断在多样化场景中落地应用,不仅涵盖传统行业的安防视频监控,还涉及到景区旅游、校园教育、社区、楼宇、智慧农业等领域的应用。感兴趣的用户可以前往演示平台进行体验或部…

Docker安装Jenkins

Docker安装Jenkins 准备工作 下载Jenkins镜像 docker pull jenkins/jenkins开始安装 创建需要挂载的本地文件夹 mkdir -p 路径/jenkens chmod 777 路径/jenkens创建并启动Container docker run -d -p 8080:8080 --name=jenkins -v 路径/jenkens/:/var/jenkins_home jenkins/jen…

vue 中利用js完成等比例缩放图片和点位跟着移动

需要等比例缩放的内容 html <div class="boxImg" ref="cont" style="position: absolute; top: 0; left: 0"><!-- 这里放上需要等比例缩放的内容 --> </div> 在vue中 methods 中写 methods: {updateScaleRatio(ImgObj, ma…

linux - 搭建部署ftp服务器

ftp 服务&#xff1a; 实现ftp功能的一个服务&#xff0c;安装vsftpd软件搭建一台ftp服务器 ftp协议&#xff1a; 文件传输协议 &#xff08;file transfer protocol&#xff09;&#xff0c;在不同的机器之间实现文件传输功能&#xff0c; 例如 视频文件下载&#xff0c;…

前端之html和css(2)

目录 一&#xff0c;html 1&#xff0c;文本相关标签 2&#xff0c;列表标签 3&#xff0c;图片标签 4&#xff0c;超链接 5&#xff0c;表格标签 table 6&#xff0c;表单 form 7&#xff0c;分区标签 二&#xff0c;css层叠样式表 1&#xff0c;css样式代码的三种引入…

【职场必备知识】一文搞懂五险一金(打工人必备)

社保局电话&#xff1a;12333五险一金非常重要的是&#xff1a;缴纳基数和缴纳比例&#xff01; 文章目录五险一金是什么五险一金缴纳比例养老保险养老保险构成退休年龄医疗保险生育险工伤保险失业险公积金补充&#xff1a;常见问题“五险二金”多出来的“一金”是什么&#xf…

Firewall Analyzer防火墙管理

企业防火墙管理 典型的企业网络安全基础设施包括传统防火墙、下一代防火墙 (NGFW)、虚拟专用网络 (VPN) 和来自多个供应商的代理服务器。网络安全管理&#xff0c;特别是防火墙安全管理尤其棘手&#xff0c;因为每个供应商的能力和技术差异很大。然而&#xff0c;市场上有许多…

kubernetes-Service服务发现

目录 一、Service基本概念 1、Pod的特征 1. Pod等资源的概念 2.解决pod进行如此多变化时的解决方案 2、Service 1. Kubernetes Service 定义了这样一种抽象&#xff1a; 2. Service的实现类型 3、Service模型 4、Endpoint Controller 5、Kube-proxy iptables 6、Kube…

ESP8266-Arduino编程实例-OLED-SSD1306(I2C)显示屏驱动

OLED-SSD1306(I2C)显示屏驱动 1、OLED介绍 OLED显示屏是指有机电激发光二极管(OrganicLight-EmittingDiode,OLED)由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一…

MSSQL注入 — 反弹注入

注意&#xff1a;仅用于本人学习的笔记记录&#xff0c;禁止进行传播分享&#xff0c;一旦造成严重后果与本人无关&#xff01;&#xff01;&#xff01; 一、MSSQL反弹注入使用场景 MSSQL>SQL Server MSSQL注入&#xff1a; 反弹注入>注入手法比较偏门(oob) 把查询…

《代码随想录》一刷记录

文章目录前言二、程序的性能分析时间复杂度分析递归算法的时间复杂度分析编程语言的内存管理内存对齐空间复杂度分析递归算法的空间复杂度分析以空间换时间是常见的优化思路三、数组二分查找移除元素长度最小的子数组螺旋矩阵四、链表链表的定义移除链表元素链表常见的操作反转…

GBase8s 汉字转拼音函数

一、GetHzFullPY 函数 GetHzFullPY 函数将汉字转换为全拼。 函数返回值为字符型。使用时&#xff0c;除汉字按顺序转换为全拼外&#xff0c;其余字符&#xff08;包括数字&#xff09;都不进行转换&#xff0c;保留原值。转换完的拼音字符串缺省为小写。 例如&#xff0c;假定 …

计算机毕设源代码网站基于SSM个人财务|记账|账单收入支出统计管理系统

&#x1f345;文末获取联系&#x1f345; 一、项目介绍 计算机毕业设计java毕设项目之SSM个人财务收入支出统计管理系统_哔哩哔哩_bilibili计算机毕业设计java毕设项目之SSM个人财务收入支出统计管理系统共计2条视频&#xff0c;包括&#xff1a;B156 257-SSM个人财务收入支出…

【爬虫知识】2022年python最新前沿技术?通过pyscript写爬虫程序

引言 昨天&#xff0c;有一个粉丝和我说&#xff0c;“仙草哥哥&#xff0c;你现在写的这些文章使用的技术都太旧了。现在的最前沿&#xff0c;最热门的python技术是pyscript&#xff0c;你应该使用一下这个&#xff01;“ 我很好奇&#xff0c;”真的吗&#xff1f;现在pysc…

stm32f4xx-I2C

文章目录一、概述1.背景2.传输方向3.速度4.地址二、IIC通信过程1.I2C通信过程中&#xff0c;存在4种信号2.起始信号和停止信号3.同步信号4.数据收传输与应答总结&#xff1a;三、应用领域四、test。。。一、概述 1.背景 I2C(IIC,Inter&#xff0d;Integrated Circuit)总线是由…

06.5. 汇聚层

文章目录6.5. 汇聚层6.5.2. 填充和步幅6.5.3. 多个通道6.5. 汇聚层 汇聚&#xff08;pooling&#xff09;层,也叫池化层&#xff0c;它具有双重目的&#xff1a; 降低卷积层对位置的敏感性同时降低对空间降采样表示的敏感性 6.5.1. 最大汇聚层和平均汇聚层 与卷积层类似&…

【毕业设计】基于SSM的教师评价考核管理系统 - ssm vue

文章目录1 前言2 实现效果3 设计方案4 最后1 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的java web缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告诉学长自己做的java web管理系统达不到…

gitlab免密码登录配置

GitLab免密码登录配置 配置 SSH 密钥 点击 add an SSH key在本地电脑当中添加生成密钥clone 远程的仓库到本地当中 配置密钥的作用&#xff1a;每次提交或者clone代码的时候&#xff0c;就不需要再输入当前用户的密码了。 点击上图中的 Add SSH key &#xff0c;跳到添加页…

【必知必会的MySQL知识】④DQL语言

&#x1f649; 作者简介&#xff1a; 全栈领域新星创作者 &#xff1b;天天被业务折腾得死去活来的同时依然保有对各项技术热忱的追求&#xff0c;把分享变成一种习惯&#xff0c;再小的帆也能远航。 &#x1f3e1; 个人主页&#xff1a;xiezhr的个人主页 &#x1f525; 专栏地…