2024/5/23 学习杂记

目录

位运算与逻辑运算读程序练习

在switchcase 语句中能否使用continue关键字?为什么?

为什么尽量不使用goto语句?

void

i++与++i

i++和++i 哪个效率更高?

良好的条件比较语句风格

memcpy

memset


位运算与逻辑运算读程序练习

int x = 3, y, z;

y = z = 2;

12  x = (y & z); printf("x = %d\n", x);

13  x = (y && z); printf("x = %d\n", x);

y = 4;

16  x = (y | z); printf("x = %d\n", x);

17  x = (y || z); printf("x = %d\n", x);

程序执行至第12 行时,y和z 的值都为2。此行把y和z 做按位与(&)运算的结果赋给变量x。y 和z 的二进制都是10,因此y & z 的结果为二进制10。因此x的值为2。

程序执行至第13 行时,y和z 的值都为2。此行把y和z 做逻辑与(&&)运算的结果赋给变量x。此时y和z 的值都不是0,因此y && z 的结果为1。因此x 的值为1。

程序执行至第16 行时,y的值为4,z 的值为2。此行把y和z 做按位或(|)运算的结果赋给变量x。此时y和z的二进制表示分别为100和010,因此y|z的结果为110。因此x的值为110,十进制表示为6。

程序执行至第17 行时,y 的值为4,z 的值为2。此行把y 和z 做逻辑或(||)运算的结果赋给变量x。此时y和z的值都不是0,因此y||z的结果为1。因此x的值为1。

在switchcase 语句中能否使用continue关键字?为什么?

switch-case语句中通常不能直接使用continue关键字。continue语句通常用于循环语句(如forwhile循环),用于跳过当前迭代并继续下一次循环迭代。 

如果switch语句位于某个循环内部,那么continue将会作用于那个外层循环,跳过循环体的剩余部分并进入下一次迭代。如果switch不在循环内部,则continue关键字在技术上虽不产生语法错误,但也没有实际用途,因为没有迭代可跳过。

为什么尽量不使用goto语句?

1. 可读性降低:goto语句使得程序的控制流变得难以追踪,阅读者需要跟随goto跳转来理解程序的执行顺序,这增加了理解难度,尤其是当程序规模增大时。

2. 结构混乱:goto破坏了程序的结构化编程原则,如顺序、分支(if-else、switch)、循环(for、while、do-while)等,这些结构提供了清晰的逻辑控制流控制方式。过度依赖goto可能导致“意大利面条代码”,难以维护。

3. 维护困难:goto使得修改和维护代码变得复杂,因为修改一处可能需要考虑对跳跃目标的影响,这可能导致连锁反应式的修改,增加了出错风险。

4. 调试挑战:在调试时,goto使得堆栈跟踪和理解程序的执行路径复杂化,调试工具可能也难以准确展示程序流程。

5. 团队协作:在团队开发环境中,使用goto可能让其他成员难以理解代码意图,增加协作难度,不利于代码评审和交接。

6. 现代替代方案:现代编程语言和实践提供了丰富的控制结构、函数、类、异常处理机制、迭代器等,能够有效替代goto达到相同目的,同时保持代码清晰和模块化。

在某些特定场合(如低级别编程、操作系统内核、嵌入式系统或某些优化特定算法)goto可能有其正当使用场景,但总体上,遵循结构化编程原则,限制或避免goto使用是提升代码质量和可维护性的共识。

void

如果指针p1和p2的类型相同,那么我们可以直接在p1和p2间互相赋值; 如果p1和p2指向不同的数据类型,则必须使用强制类型转换运算符把赋值运算符右边的 指针类型转换为左边指针的类型。

例如:

float *p1;

int *p2;

p1 = p2;

其中p1=p2语句会编译出错,提示“'=' :cannotconvertfrom'int*' to 'float*'”,必须改为: p1 = (float *)p2;

而void*则不同,任何类型的指针都可以直接赋值给它,无需进行强制类型转换:

void *p1;

int *p2;

p1 = p2;

但如果

void *p1;

int *p2;

p2 = p1;

就会提示“'=' : cannotconvertfrom 'void *' to 'int *'”。

必须写成  p2 = (int *)p1

i++与++i

#include <stdio.h>
int main(void){int i=8;printf("%d\n",++i);printf("%d\n",--i);printf("%d\n",i++);printf("%d\n",i--);printf("%d\n",-i++);printf("%d\n",-i--);printf("------\n");return 0;}

求输出内容。

程序的说明如下:

程序第7 行,此时i 的值为8。这里先i 自增1,再打印i 的值。因此输出9,并且i的值也变为9。

程序第8 行,此时i 的值为9。这里先i 自减1,再打印i 的值。因此输出8,并且i的值也变为8。

程序第9 行,此时i 的值为8。这里先打印i 的值,再i 自增1。因此输出8,并且i的值也变为9。

程序第10 行,此时i 的值为9。这里先打印i 的值,再i 自减1。因此输出9,并且i的值也变为8。

程序第11 行,此时i 的值为8。这里的“-”表示负号运算符。因此先打印-i 的值,再i自增1。因此输出-8,并且i的值也变为9。

程序第12 行,此时i 的值为9。这里的第一个“-”表示负号运算符,后面连在一起的两个“-”表示自减运算符。因此先打印-i的值,再i自减1。因此输出-9,并且i的值也变为8。

i++和++i 哪个效率更高?

内建数据类型的情况,效率没有区别。

自定义数据类型的情况,++i效率较高。

i++(后置自增)和++i(前置自增)在大多数现代编译译器下对于基本数据类型(如int、float、double等)来说,性能上几乎没有区别。这两种操作最终生成的汇编译代码很可能是相同的,尤其是在优化级别较高的编译译条件下。

在C++中:

•后置自增i++会先返回i的当前值,然后将i的值加1。

•前置自增++i会先将i的值加1,然后返回加1之后的值。理论上讲,如果值不需要被保留,使用++i可能略微高效,因为它直接计算并返回新值,而i++可能涉及一个临时变量来存储旧值。但在实际应用中,这种差异微乎其微,几乎不影响程序的整体性能,特别是在考虑现代处理器的速度和编译器优化技术。

在具体应用时,选择i++还是++i更多基于语境和语义的清晰性,而非性能考虑。

如果增量操作的结果是赋值操作的一部分,使用++i更自然;

如果需要先使用原值后递增,则用i++。

良好的条件比较语句风格

假设浮点变量的名字为 x,它与 0.0的比较如下。

第一种:

1 if (x == 0.0)

2 if (x != 0.0)

第二种:

1 if ((x >= -EPSINON) && (X <= EPSINON))

2 if ((x < -EPSINON) || (X > EPSINON))

其中,EPSINON是允许的误差(精度)。

第二种风格较良好。

注意:无论是float 还是double 类型的变量,都有精度限制。所以一定要避免将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。

假设布尔变量名字为flag,它与零值比较的标准if语句如下。

第一种:

1 if (flag == TRUE)

2 if (flag == FALSE)

第二种:

1 if (flag)

2 if (!flag)

第二种风格较良好。根据布尔类型的语义,零值为“假”(记为 FALSE),任何非零值都是“真”(记为TRUE)。TRUE的值究竟是什么并没有统一的标准。例如Visual C++将TRUE定义为1,而Visual Basic 则将TRUE 定义为-1。因此不可将布尔变量直接与TRUE、FALSE进行比较。

假设整型变量的名字为value,它与零值比较的标准if语句如下。

第一种:

1 if (value == 0)

2 if (value != 0)

第二种:

1 if (value)

2 if (!value)

第一种风格较良好,第二种风格会让人误解value 是布尔变量,应该将整型变量用“==”或“!=”直接与0比较。

memcpy

void * memcpy(void *dest,constvoid *src,size_t len);

用于将一块内存区域的数据从源地址复制到目的地址

每个参数的含义如下:

•void *dest:指向复制内容将要存放的目标数组的指针。目标区域必须有足够的空间来容纳复制的内容。

•const void *src:指向要复制内容的源数组的指针。

•size_t len:从源到目标复制的字节数。

#include <stdio.h>
#include <string.h>int main() {char src[50] = "Hello, World!";char dest[50]; // 目标量足够大以容纳src的内容// 使用memcpy函数复制src数组的内容到destmemcpy(dest, src, src, strlen(src) + 1); // 注意加1是因为要复制字符串末尾部的'\0''printf("Original String: %s\n", src);printf("Copied String: %s\n", dest);return 0;
}

在长度上加1是为了确保字符串的终止符也被复制,因为strlen不计算字符串的终止符'\0'字符

输出结果

Original String: Hello, World!
Copied String: Hello, World!

memset

void *memset(void *buffer, int c, size_t num, size_t size);

memset函数会将从buffer指向的内存地址开始的连续size个字节(字节)全部设置为c指定的值。这个函数常用于清零内存块(当c设为0时),或者快速填充固定值。

#include <stdio.h>
#include <string.h>int main() {int arr[10];memset(arr, 0, sizeof(arr)); // 将整个arr数组清零printf("Array after memset: %d\n", arr[0]); // 输出应为0,因为所有元素都被清零了return 0;
}

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

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

相关文章

如何解决Redis缓存击穿?

Redis缓存击穿问题,也称作热点Key问题,通常发生在高并发场景下,当一个被高并发访问且缓存重建业务较复杂的key突然失效时,大量请求会同时访问数据库,导致数据库压力瞬间增大。以下是解决Redis缓存击穿问题的几种方案: 使用锁(互斥锁): 原理:当缓存失效时,不是所有线…

CTF| 格式化字符串漏洞

格式化字符串漏洞是PWN题常见的考察点&#xff0c;仅次于栈溢出漏洞。漏洞原因&#xff1a;程序使用了格式化字符串作为参数&#xff0c;并且格式化字符串为用户可控。其中触发格式化字符串漏洞函数主要是printf、sprintf、fprintf、prin等C库中print家族的函数 0x01 格式化字符…

双非二本找工作前的准备day28

学习目标&#xff1a; 每天复习代码随想录上的题目2-3道算法&#xff08;时间充足可以继续&#xff09; 今日碎碎念&#xff1a; 1&#xff09;进入贪心与dp专题&#xff0c;过完准备二刷&#xff0c;以及刷剑指offer。 2&#xff09;这两天没更新是休息一下&#xff0c;然后…

如何深入理解、应用及扩展 Twemproxy?no.15

Twemproxy 架构及应用 Twemproxy 是 Twitter 的一个开源架构&#xff0c;它是一个分片资源访问的代理组件。如下图所示&#xff0c;它可以封装资源池的分布及 hash 规则&#xff0c;解决后端部分节点异常后的探测和重连问题&#xff0c;让 client 访问尽可能简单&#xff0c;同…

C语言之宏详解(超级详细!)

目录 一、用宏前须知-#define相关知识 大致结构&#xff1a; 对预定义符号的补充&#xff1a; 二、用#define定义宏 什么是宏&#xff1f; #define的替换规则&#xff1a; 三、常用的宏定义 1、宏定义常量 2、定义一个宏语句 3、宏定义函数 宏与函数的对比&#xff1a; …

29【PS 作图】宫灯 夜景转换

夜景转化 1 原图 2 选中要变换的图层,然后点击“颜色查找” 再3DLUT文件中,选择moonlight.3DL,可以快速把图层变成偏夜景的颜色 结果如下: 3 选择“曲线” 把曲线 右边往上调【亮的更亮】,左边往下调【暗的更暗】 4 添加灯光 新建一个图层

前端面试题大合集8----性能优化篇

一、哪些方法可以提升网站前端性能 1、Http请求优化 主要分为减少Http请求次数&#xff0c;减小请求数据量和缓存三方面。 减少Http请求次数&#xff0c;可以通过以下方法实现&#xff1a; 合并js、css文件&#xff1b;使用css-spirites技术合并图片&#xff1b;压缩图片大…

HTML+CSS+JS简易计算器

HTMLCSSJS简易计算器 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>简易计算器</t…

AAA实验配置

一、实验目的 掌握AAA本地认证的配置方法 掌握AAA本地授权的配置方法 掌握AAA维护的方法 1.搭建实验拓扑图 2.完成基础配置&#xff1a; 3.使用ping命令测试两台设备的连通性&#xff1a; 二、配置AAA 1.打开R1&#xff1a;配置AAA方案 这两个方框内的可以改名&#xff0c…

百度页面奔跑的白熊html、css

一、相关知识-动画 1.基本使用&#xff1a;先定义再调用 2. 调用动画 用keyframes定义动画&#xff08;类似定义类选择器&#xff09; keyframes动画名称{ 0%{ width:100px&#xff1b; } 100%{ width:200px; } } 使用动画 div { width:200px; height:200px; background-…

前端面试题日常练-day28 【面试题】

题目 希望这些选择题能够帮助您进行前端面试的准备&#xff0c;答案在文末。 1. 在Vue中&#xff0c;以下哪个选项用于监听组件生命周期钩子函数&#xff1f; a) watch b) computed c) lifecycle d) created 2. 在Vue中&#xff0c;以下哪个选项用于在列表渲染时为每个元素…

Pytorch线性模型(Linear Model)

基本步骤 ①首先准备好数据集&#xff08;DataSet&#xff09; ②模型的选择或者设计&#xff08;Model&#xff09; ③进行训练&#xff08;Train&#xff09;大部分模型都需要训练&#xff0c;有些不需要。这一步后我们会确定不同特征的权重 ④推理&#xff08;inferring…

开封旅游三天两夜旅游攻略

开封是一座历史悠久的城市&#xff0c;有着丰富的文化遗产和美食。以下是一个三天两夜的开封旅游攻略&#xff0c;供你参考&#xff1a; 一、行程安排 第一天&#xff1a; 上午&#xff1a;抵达开封&#xff0c;前往酒店办理入住手续。随后参观开封博物馆&#xff0c;了解开封…

【Python安全攻防】【网络安全】一、常见被动信息搜集手段

一、IP查询 原理&#xff1a;通过目标URL查询目标的IP地址。 所需库&#xff1a;socket Python代码示例&#xff1a; import socketip socket.gethostbyname(www.163.com) print(ip)上述代码中&#xff0c;使用gethostbyname函数。该函数位于Python内置的socket库中&#xf…

广场舞团|基于SprinBoot+vue的广场舞团系统(源码+数据库+文档)

广场舞团系统 目录 基于SprinBootvue的广场舞团系统 一、前言 二、系统设计 三、系统功能设计 1 系统功能模块 2 后台登录模块 5.2.1管理员功能模块 5.2.2社团功能模块 5.2.3用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推…

Pytorch-06 使用GPU加速计算

要在PyTorch中使用GPU加速计算&#xff0c;需要将模型和数据移动到GPU上进行处理。以下是上一节演示修改后的示例代码&#xff0c;展示了如何在训练过程中利用GPU加速计算&#xff1a; import torch import torch.nn as nn import torch.optim as optim import time# 检查GPU是…

2024-05-28 问AI: 在深度学习中,什么是反向随机失活?

文心一言 在深度学习中&#xff0c;反向随机失活&#xff08;Inverse Randomized Elimination&#xff0c;通常称为Dropout&#xff09;是一种在训练深度神经网络时常用的正则化技术&#xff0c;用于防止过拟合。该技术通过随机将神经网络中的一部分神经元“失活”或“丢弃”来…

深度剖析:为什么 Spring 和 IDEA 都不推荐使用 @Autowired 注解

目录 依赖注入简介 Autowired 注解的优缺点 Spring 和 IDEA 不推荐使用 Autowired 的原因 构造器注入的优势 Autowired 注解的局限性 可读性和可测试性的问题 推荐的替代方案 构造器注入 Setter 注入 Java Config Bean 注解 项目示例&#xff1a;Autowired vs 构造器…

Android 项目Gradle文件讲解(Groovy和Kotlin)

Android 项目Gradle文件讲解&#xff08;Groovy和Kotlin&#xff09; 前言正文一、Gradle的作用二、Gradle的种类① 工程build.gradle② 项目build.gradle③ settings.gradle④ gradle.properties⑤ gradle-wrapper.properties⑥ local.properties 三、Groovy和Kotlin的语言对比…

装饰模式:鸡腿堡

文章目录 UML类图目录结构Humburger.javaChickenBurger.javaCondiment.javaChuilli.javaLettuce.javaTest.java深度理解test怎么写 UML类图 目录结构 我们从指向最多的开始写 Humburger.java package zsms;public abstract class Humburger {protected String name;public S…