C语言经典错误总结(二)

一.运算符优先级问题

该问题对于大多数C语言程序员都是存在的,原因当然就是无法准确找到表达式计算顺序。

看例题:

假如我们有两个整数a ,b,现在我们要求整数c是一个八位整数,使其前4位与a相同,后4位与b相同,那么我们可能会写出以下代码:

#include <stdio.h>
int main()
{int a = 0;int b = 0;scanf("%d %d", &a, &b);int c = a << 4 + b;printf("%d\n", c);return 0;
}

你认为它对吗?

如果你不去深究其中运算关系,可能就直接认为它是对的,但如果你知道:加法的优先级是比移位操作符优先级高的,就会一眼看到问题所在

该代码实际行为如下:

int c = a <<( 4 + b);

会发现顺序有了变化,从而出错!

那么我们如何改呢:

1.我们可以加括号,这也是避免大部分错误的不二之法。

int c = ( a << 4 ) + b;

2.我们可以用 |  操作符

int c = a<< 4 | b;

虽然我们可以用括号解决不少问题,但如果所需的括号太多,反而会出现不易理解的情况(假如你写过类似的代码就深有体会),所以我们学会运算符优先级还是非常有必要的。

关于运算符顺序,大家肯定都可以去查,这里只讲一个记忆法:

最高者:()[]  ->  .

单目操作符>双目操作符(算数操作符>移位操作符>关系操作符>逻辑操作符)>三目操作符 >赋值操作符>逗号操作符

至于每个运算符的结合方向读者可自行了解。

思考与感悟:

读者有没有想过这样一个问题,为啥运算符优先级是这样的?例如:为啥逗号运算符级别最低?

为啥赋值运算符比条件运算符低呢?读者可以认真思考

这里,我们帮大家解释一下上面的例子,读者可以去思考其他操作符情况

逗号运算符常用在需要一个表达式中而不是一条语句情况下替换作为语句结束标志的分号,如写一个这样的表达式:

Add(a+2,b*5);

赋值运算符为啥会比条件低呢?看下面代码:

c = a + b >100 ?  1 : 0;

关于运算符,就写到这里,希望大家在用到时能三思而后行,也希望大家可以不再出错!

二.注意语句结束标志的分号

为啥要强调这个呢?原因便在与分号对于C语言有些程序非常重要,例如:

#include <stdio.h>
int main()
{int x = 0;if (x > 10);printf("hehe\n");return 0;
}

这个代码结果显然是一定会输出hehe,为啥呢?就是多写了分号,实际中,大家可能多写,也可能少写,这都是非常严重的问题,我们不能只依赖IDE,自己强大才是王道。

struct calendar
{int year;int month;int day;}

这个结构体看出问题了吗?

显然,还是分号的问题!!!

该小节希望大家对分号能够加深印象,万不可出现多或少的问题

三."悬置“else问题

关于else问题,我们只需要记住其与最近的if对齐(上面程序)!

#include <stdio.h>
int main()
{int x = 10;int y = 1;if (x == 0)if (y == 0)error();else{int z = x + y;Func(z);}return 0;
}

该代码就姮好的解释了else问题,我们在写时一定要注意,当然,你认为IDE会帮你识别所有,只能说......

总之,希望大家能够不断减少自身语法错误吧!

四.这问题我们共同探讨

#include <stdio.h>
int main()
{int arr1[] = { 31,28,31,30,31,30,31,31,30,31,30,31 };return 0;
}

关于数组元素初始化,大家都是这样写的,那么如果我在最后一个31后面再加一个,编译器是不会报错的,大家知道这是为什么吗?

对于这里我本身也是不太能理解的,因为我没实际写过这样的代码,所以如果你有不错的想法,可以评论或者私信我,欢迎大家一起学习。

最后,大家一起加油!

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

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

相关文章

【java】保留前N月数据文件,定期删除数据

数据越积越多&#xff0c;过于冗余&#xff1b;数据库定期删除指定时间前的数据&#xff1b;文件生成的删除指定时间前端文件 SFTP文件定期删除 java sftp 定时清理指定文件中固定时间 依赖 <!-- ftp文件上传/下载Jar包 --> <dependency><groupId>com.jc…

K8S(四)—pod详解

目录 pod介绍Pod的概念&#xff1a;Pod的特性&#xff1a;Pod的配置&#xff1a;Pod的控制&#xff1a;示例 YAML 文件&#xff1a; pod启动流程问题 两种方式启动镜像的升级和回滚更新 Deployment&#xff1a;回滚检查 Deployment 历史版本回滚到之前的修订版本缩放 Deploymen…

青少年CTF-Crypto(Morse code/ASCII和凯撒)

FLAG&#xff1a;你这一生到底想干嘛 专研方向: Web安全 &#xff0c;Md5碰撞 每日emo&#xff1a;不要因为别人都交卷了&#xff0c;就乱选答案 文章目录 1.Morse code2、ASCII和凯撒的约定 1.Morse code 题目提示摩尔斯电码&#xff0c;这个是给的附件 直接用摩尔斯解密&am…

Linux中的磁盘挂载与取消

Linux中的磁盘挂载与取消 前言磁盘挂载查看分区信息分区设置格式化磁盘挂载持久化挂载点配置 取消磁盘挂载查看已挂载的磁盘取消挂载 前言 今天准备给一台PVE设备添加一块磁盘&#xff0c;踩了点小坑&#xff1a;磁盘挂载后重启后发现磁盘没有被挂载&#xff0c;于是整理记录一…

antv X6

文章目录 graph配置项力导向图路由router graph配置项 https://x6.antv.antgroup.com/api/graph/graph 力导向图 https://x6.antv.antgroup.com/examples/layout/general#force 路由router https://x6.antv.antgroup.com/api/registry/router initGraph () {// https://x…

常用的测试用例大全

登录、添加、删除、查询模块是我们经常遇到的&#xff0c;这些模块的测试点该如何考虑 1)登录 ① 用户名和密码都符合要求(格式上的要求) ② 用户名和密码都不符合要求(格式上的要求) ③ 用户名符合要求&#xff0c;密码不符合要求(格式上的要求) ④ 密码符合要求&#xf…

[c]输出字符金字塔

我们可以把字符金字塔类比数字金字塔 输入3 输出 类似下图 下面附上我的代码&#xff0c;可能有些繁琐 #include<stdio.h> int main() {char s;scanf("%c",&s);int lens-64;//将字符的ascii码值减去64得到循环次数&#xff0c;比如你输入A&#xff0c;l…

Java入门基础:浅显易懂 死循环

文章目录 一、什么是死循环二、以fo循环示例三、如何避免死循环 一、什么是死循环 死循环就是循环语句的 循环布尔表达式 一直为true&#xff0c;没有终止循环的条件或者终止循环的条件根本不可能达成 二、以fo循环示例 /** 终止循环的条件根本不可能达成* 循环布尔表达式&a…

一篇文章,带你详细了解华为认证体系证书(二)

一篇文章&#xff0c;带你详细了解华为认证体系证书 &#xff08;一&#xff09;_华为高斯数据库证书_PICACHU的博客-CSDN博客一、总体概括一、总体概括华为认证是华为技术有限公司基于“平台生态”战略&#xff0c;围绕“云-管-端”协同的新ICT技术架构&#xff0c;打造的业界…

Spring Boot--Freemarker渲染技术+实际案例

目录 Freemarker 1.1.什么是Freemarker 1.2.Freemarker模板组成部分 1.3.优点 FreeMarker常见的方法&#xff1a; 2.2.2.数值 2.2.3.布尔值 2.2.4.日期 2.3.常见指令 2.3.1.处理不存在的值 assign 2.3.4.list 2.3.5.include SpringBoot整合Freemarker Freemarker…

STM32-TIM定时器输出比较

目录 一、输出比较简介 二、PWM简介 三、输出比较通道&#xff08;通用&#xff09; 四、输出比较通道&#xff08;高级&#xff09; 五、输出比较模式 六、PWM基本结构 七、PWM参数计算 八、外设介绍 8.1 舵机 8.2 直流电机及驱动 九、开发步骤 十、输出比较库函数…

每日一题,杨辉三角

给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] 示例 2: 输入: numRows 1 输出: [[1]]

机器学习笔记:linear scaling learning rate (学习率 和batch size的关系)

在训练神经网络的过程中&#xff0c;随着batch size的增大&#xff0c;处理相同数据量的速度会越来越快&#xff0c;但是达到相同精度所需要的epoch数量越来越多 换句话说&#xff0c;使用相同的epoch数量时&#xff0c;大batch size训练的模型与小batch size训练的模型相比&am…

【C++】POCO学习总结(十五):字符串操作

【C】郭老二博文之&#xff1a;C目录 1、简介 POCO提供一些函数来处理 std::string 和 std::wstring&#xff1b; 比如&#xff1a; 去除空格大小写转换不区分大小写比较字符转换和子字符串替换连接 许多函数有两种变体: 返回一个新字符串而不修改原字符串的函数;直接修改…

限流常用算法以及基于Sentinel的微服务限流及熔断

一、服务限流的作用及实现 在没有任何保护机制的情况下&#xff0c;如果所有的流量都进入服务器&#xff0c;很可能造成服务器宕机导致整个系统不可用&#xff0c;从而造成巨大的损失。为了保证系统在这些场景中仍然能够稳定运行&#xff0c;就需要采取一定的系统保护策略&…

Unity_ET框架项目-斗地主_启动运行流程

unity_ET框架项目-斗地主_启动运行流程 项目源码地址&#xff1a; Viagi/LandlordsCore: ET斗地主Demohttps://github.com/Viagi/LandlordsCore下载项目到本地。 启动运行步骤&#xff1a; 下载目录如下&#xff1a; 1. VS&#xff08;我用是2022版VisualStudio&#xff09…

【机器学习】多模态机器学习

多模态机器学习是指利用多种不同的数据类型&#xff08;如图像、文本、音频等&#xff09;来训练和优化机器学习模型。相比于单一模态的机器学习&#xff0c;多模态机器学习可以更好地模拟现实世界中的复杂信息交互&#xff0c;从而提高模型的性能和泛化能力&#xff0c;同时也…

[英语学习][13][Word Power Made Easy]的精读与翻译优化

[序言] 本篇内容主要是学习语法分析, 而且这次作者翻译也不错. [英文学习的目标] 提升自身的英语水平, 对日后编程技能的提升有很大帮助. 希望大家这次能学到东西, 同时加入我的社区讨论与交流英语相关的内容. [原著英文与翻译版对照][第20页] There is no doubt that the…

大数据机器学习与深度学习—— 生成对抗网络(GAN)

GAN概述 在讲GAN之前&#xff0c;先讲一个小趣事&#xff0c;你知道GAN是怎么被发明的吗&#xff1f;据Ian Goodfellow自己说&#xff1a; 之前他一直在研究生成模型&#xff0c;可能是一时兴起&#xff0c;有一天他在酒吧喝酒时&#xff0c;在酒吧里跟朋友讨论起生成模型。然…

Linux—深入理解进程的概念,PCB,父子进程及查看进程信息的两种方法

进程的概念 课本概念&#xff1a;程序的一个执行实例&#xff0c;正在执行的程序等。 内核观点&#xff1a;担当分配系统资源&#xff08;CPU&#xff0c;内存&#xff09;的实体。 1.描述进程-PCB 我们知道程序是代码编译好后形成的可执行文件&#xff0c;存放在磁盘上。而我…