c陷阱与缺陷 学习笔记

【赛题解析&命令脚本配置】2023年全国职业院校技能大赛GZ073网络系统管理赛项赛题第10套模块A:网络构建 & (五)网络运维配置+(六)SDN网络配置-命令配置 阅读详情

对于一些简单的1错误将不列举,这些应该是必须掌握的。

1.词法缺陷

编译器第一部分是词法分析器。这里进行2次划分标记(token)。一次划分的目的是为了宏扩展;二是将进行宏替换的程序划分标记(token);

错误1:=不是==,&和|不是&&和||

错误2:多字符记号

y=x/*p /*p指向除数*/ (错误)

良好的程序书写习惯也是避免这种错误的方法之一,可以写成y = x / p。在中间加几个空格来划分标记。或者写成y = x / (*p)。

错误3:例外

组合赋值运算符实际上是2个标记

a + /**/ = 1和 a += 1一样的。看起来是1个标记,实际上是2个标记,这是一个特例。

错误4:字符串和字符 (略)

2.词法缺陷

理解c语言,仅了解构成他的标记是不够的。还要理解这些记号是如何构成声明、表达式、语句和程序的。

(1).理解声明

声明组成:一个类型和一组具有特定格式的期望对该类型求值的表达式。最简单的表达式就是变量,如 float f, g;

如:float ff();说明ff()是一个float,应此ff()是一个返回一个float的函数。

float pf;说明pf是一个float,并且pf是一个float的指针

这些形式对与组合声明表达式是一样的。因此,

float g(), (*h)();表示*g()和(*h)()都是float表达式,由于()比*绑定更紧密,*g()和*(g())是一样的。g是一个返回float指针的函数。h是一个指向返回float的函数的指针。

类型的模型:当我们知道如何声明一个给定类型的变量以后,就能够很容易的写出一个类型的模型(cast)。只要删除变量名和分号并将所有的东西包围在一对()中。

如:float *g()的模型就是(float *())。

理解 (*(void (*)())0)()

第一步:这是一个函数,变量为指向函数的指针,把整个表达式样写成(*fp)();*fp就是函数本身,我们现在需要寻找一个合适的表达式来替换fp。

第二步:本例中函数的地址就是0,可以将上面的(*fp)()写成(*0)(),但这样是不行的,因为*运算要求必须有一个可以指针作为他的操作数。另外,这个操作数还必须是一个指向函数的指针,以保证*的结果可以被真确的调用。应此我们需要将0转换为一个”指向返回为void的函数的指针”:(void (*)())0。接下来我们用(void (*)())0来替换fp得到(*( void(*)())0();结尾的”;”表示将这个表达式转换为一个语句。

我们可以使用typedef来简化这个过程:

typedef void (*funcp)();

(*(funcp)0)();

(2)运算符号并不总是具有你所想象的优先级

避免错误的方法就是多多使用()。

3.链接

一个c程序可以有多个部分组成,他们被编译,并通过链接器绑定到一起。

(1)必须自己检查外部类型

如有一个c程序,被划分为2个文件。

其中一个文件声明了int n,另外一个文件声明了long n。这不是一个有效的c程序,因为一些外部名称在两个文件中被声明为不同的类型。这个错误在编译时是不能被发现的,因为编译程序只对单个文件编译。这些检查工作有链接器来完成。

这些规则只在使用全局变量时候起作用。

4.语义缺陷

(1)c并不总是转换实参

如:

double s;

s = sqrt(2);

printf(“%g/n”, s);

sqrt()需要一个double作为参数,但没有得到。返回一个double值但没有这样的声明。

double s;

s = sqrt(2.0);

printf(“%g/n”, s);

 

 

main() {

int i;

char c;

for(i = 0; i < 5; i++) {

        scanf("%d", &c);

        printf("%d", i);

}

printf("/n");

}

这里错误的原因是scanf去读取一个整数,他需要一个指向整数的指针,而这里是一个字符的指针,他将输入当成一个整数存储到那里。一个整数占用比字符更多的内存,这样可能影响到附近的内存。

(2)指针不是数组

【企业智能体开发】优化模型成本、延迟与失败降级 小林的培训快开始时,服务台花很久“思考最优回答”,体验并不会更好。反过来,为了省钱而始终选最轻的模型,若连房间、连接方式和任务状态都识别不稳,后续错误检索和重复建单会造成更大代价。企业 Agent 的优化对象不是单次模型调用价格,而是任务在可接受时间内、安全地推进到正确结果的总成本。 阅读详情

相关推荐

IP2315高效同步降压充电IC在快充应用中的硬件与软件控制策略

本文深入解析IP2315高效同步降压充电IC在快充应用中的硬件与软件控制策略,涵盖其核心特性、硬件电阻调节技巧、I2C动态控制方案、散热设计优化及典型问题排查。IP2315支持多种快充协议,如Type-C PD、华为FCP等,适用于便携设备快速充电需求,并通过I2C实现灵活的充电参数设置,提升充电效率与安全性。

weixin_29248313的博客 539

《C陷阱与缺陷》学习笔记

第一章 词法陷阱 笔记本:《C陷阱与缺陷》 创建时间:2018/4/23 22:06:21 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs

lyy296293760的博客 4698

伺服驱动器485控制(1):使用串口软件来读参数

下面介绍如何读伺服驱动器的一圈脉冲数,通过查看伺服驱动器说明书,得知一圈脉冲数的参数是PA11 其通讯地址是十进制 11 十六进制 0A, 串口软件指令都是以十六进制表示,字节单位。注意:485通讯地一定要接,如果不接可能会通讯异常,假如上位机没有485通讯地,而接了两根485+ 和485-,出现通讯不好和反应慢的情况,请把485GND接在上位机0V。笔记本的网口不要和驱动器了网口用网线连接,笔记本网口是以太网,伺服驱动器网口是485。通过驱动器按键面板查看PA11的参数是10000,因此数据对的上。

weixin_39727602的博客 5131

《C陷阱与缺陷》学习笔记总结:词法陷阱、语法陷阱、语义陷阱,连接、库函数、预处理器、可移植性缺陷及其他

近期课程的作业需要用到RPC编程,除了课堂上学到的知识,还得亲自动手。打算先写个简单的HelloWorld练习一下,顺便复习一下学到的知识。   RPC意为远程过程调用协议(Remote Procedure Call Protocol)。编制好单机应用程序,然后划分为两个或多个程序片,加入通信协议使得每片可以在单独的计算机上运行。从一个程序片调用另一个程序片的过程称为远程过程调用,即RPC。

benpaobagzb的博客 581

RoboMaster机甲大师赛备赛:如何用STM32+CAN总线精准控制四个大疆3508电机?

本文详细介绍了在RoboMaster机甲大师赛中,如何利用STM32和CAN总线技术精准控制四台大疆3508电机。从硬件架构设计、多电机ID分配、数据解析到同步控制算法,全面解析了构建高响应、低延迟底盘驱动系统的关键技术,助力参赛队伍提升机器人运动性能。

weixin_28684825的博客 134

Nordic开发者必备:SEGGER Embedded Studio免费许可证申请与配置全攻略

本文为Nordic芯片开发者提供了SEGGER Embedded Studio(SES)集成开发环境的详细配置指南。内容涵盖免费许可证的合规申请流程、项目创建、Nordic SDK集成,以及编辑器优化、构建调试配置、RTT日志输出等核心功能的高效设置,旨在帮助开发者构建深度优化的专业开发环境,显著提升嵌入式开发效率。

cheese的博客 353

《C陷阱与缺陷》学习笔记(上):词法陷阱、语法陷阱、语义陷阱

自从上大学起,接触C也很久了,但是一直不怎么深入,也疏于练习。课程学习之余,专门的C只看过《C程序设计语言》、《C primer plus》,现在终于有了点时间看看更多的书了。本文主要记录阅读和学习《C陷阱与缺陷》的一些心得体会。 11月15日 前言和导读   “得心应手的工具在初学时的困难程度往往超过那些容易上手的工具。”比较认同这句话。我至今觉...

weixin_34310127的博客 148

别再死磕NFP了!用Python+遗传算法搞定异形件自动排版(附完整代码)

本文介绍了如何利用Python和遗传算法实现异形件智能排版,解决传统NFP方法计算复杂的问题。通过Shapely库处理几何运算和DEAP库搭建遗传算法框架,结合模拟退火策略避免局部最优,显著提升材料利用率。附完整代码和优化技巧,适用于服装裁剪、金属加工等行业。

weixin_26965807的博客 236

《C陷阱与缺陷》2.1:理解函数声明 ( *( void( * )( ) )0 )( ) 学习笔记

---------------------------------------------------------------------------------------------------------------------------------《C陷阱与缺陷》----第二章 语法陷阱_if (((t = btype(pt1->aty) == strty) || t == uniont-优快云博客

huangdou666的博客 420

【ArcGIS Pro微课1000例】0022:基于DEM进行流域分析生成流域图

填洼Fill,在进行水文分析后续操作前,首先要对DEM进行填洼,创建无凹陷点的DEM。在ArcGIS中使用的是八方向流量建模(D8算法),工具位于水文分析下的【流向】。填洼需要使用水文分析工具下的【填洼】。确定输入与输出即可。

智慧空间实验室 2753

第2章-系统控制原理 -> 经典控制理论

第1章 回到目录 第3章 2 控制原理2.1 控制系统的数学模型2.1.1 时域数学模型2.1.2 复域数学模型2.2 线性系统的稳定性2.2.1 复数域稳定判据2.2.2 频率域稳定判据2.3 线性系统状态空间模型2.3.1 状态空间表达式2.3.2 状态空间系统设计2.4 李雅普诺夫稳定性分析2.4.1 李雅普诺夫稳定性2.4.2 李雅普诺夫稳定判据 2.1 控制系统的数学模型 2.1.1 时域数学模型 2.1.2 复域数学模型 2.2 线性系统的稳定性 2.2.1 复数域稳定判据 2.2....

赵继超的笔记 5551

C陷阱与缺陷学习笔记

N年读过这本书,当时读的时候囫囵吞枣,加上时间久远,90%的内容都忘记了。昨天在整理书籍的时候翻出来了,这本书短小精悍却不失为经典之作。抽出时间再拜读一遍,顺便做做笔记,记录精华。

zfs2008zfs的博客 3607

基于CST的PCB通孔三维建模实例

本文简明扼要地描述了如何利用CST的参数化脚本快速生成PCB的通孔三维模型,非常适合于进行快速精准的PCB参数分析。

一只豌豆象的博客 1834

C陷阱和缺陷学习笔记

 C陷阱和缺陷学习笔记: 词法陷阱:1        = 不同于==不要在程序中将两者写错,小心。将表达式与常量比较时,可将常量放在左边。2        &和| 不同于&& 和 ||。3        词法分析中的贪心法:每个符号应该包含尽可能多的字符。如果(编译器的)输入流截至某个字符前都已经分解为一个个符号,那么下一个符号将包括从该字符之后可能组成一个字符的最长字符串

Make Progress Everyday! 761

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

【学习笔记】C缺陷与陷阱

优先级比单目运算符要低的,接下来就是双目运算符,在双目运算符中,算术运算符的优先级最高,移位运算符次之,关系运算符再次之,接着是逻辑运算符,赋值运算符,最后是条件运算符;在所有的运算符中,逗号运算符的优先级最低;典型的链接器把编译器或汇编器生成的若干个目标模块,整合成一个被称为载入模块或可执行文件的实体,该实体能够被操作系统直接执行,其中某些目标模块是直接作为输入提供给链接器的;答:一个异常终止的程序可能没有机会来清空其输出缓冲区,因此,该程序生成的输出可能位于内存的某个位置,但却永远不会被写出了,

368

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

《C陷阱与缺陷》学习笔记(一)

《C陷阱与缺陷》学习笔记(一) 分类: c++专区 2014-06-06 16:12 308人阅读 评论(0) 收藏 举报 前言和导读   “得心应手的工具在初学时的困难程度往往超过那些容易上手的工具。”比较认同这句话。我至今觉得自己其实还是个刚入了门的初学者。   第一章  “词法”陷阱     由于之前学过编译原理,对编译器词法分

xu_ya_fei的专栏 492

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

【转】C缺陷和陷阱学习笔记

http://www.cnblogs.com/hbiner/p/3591335.html?utm_source=tuicool&utm_medium=referral 这段时间把《C陷阱和缺陷》看了,没时间自己写总结。就转一下别人的学习笔记吧http://bbs.chinaunix.net/thread-749888-1-1.html ...

weixin_30685029的博客 128

c陷阱与缺陷学习笔记

http://c.chinaitlab.com/c/basic/200907/789321.html   词法陷阱:    1        = 不同于==不要在程序中将两者写错,小心。将表达式与常量比较时,可将常量放在左边。    2        &和| 不同于&& 和 ||.    3        词法分析中的贪心法:每个符号应该包含尽可能多的字符。如果(编译器的)

james@BJ的专栏 582

C陷阱与缺陷(学习笔记)

前言 掌握细节并不难,难的是如何运用之妙! 词法“陷阱” 词:单词 符号=作为赋值预算,是因为操作频繁,书写简单 词法分析中的“贪心法” a—b与表达式a – - b的含义相同,而与a - – b的含义不同 y = x/*p与y = x / *p不同(第一个/*被理解为注释符) 理解:这也许就是编码规范要求操作符两侧添加合理空格的原因之一吧 字符与字符串 用双引号引起的字符串,代表的却是一个指向无名数组起始字符的指针。 字符’/0’对应的十进制是0 语法“陷阱” 运算符优先级 括号(),数组下标[]

canpool 532

c陷阱和缺陷学习笔记

1.1 = 赋值运算符 == 比较运算符 1.2 && 逻辑或 ||逻辑与 & 按位或 | 按位与 1.3 如果(编译器)输入流截止至某个字符之前都已经被分解为一个个符号,那么下一个符号将包括从该字符之后可能组成一个符号的...

diaxfw2168的博客 151

C缺陷与陷阱学习笔记

 易上手的工具往往功能有限,满足不了高手。得心应手的工具初学时的困难往往超过那些容易上手的工具。但一旦熟练后,则会觉得那些易上手的工具最后都碍手碍脚。 使其难于做傻事往往使其难于做聪明事。 Chapter 1 词法陷阱 程序中的单个字符孤立起来看并没有什么意义,只有结合上下文才有意义,如p->s = "

trunk0813的专栏 422
上一篇: mss and mtu relations
下一篇: shutdown and close differences
sim
sim
博客等级 码龄25年 2粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值