ACLGUI IN SSTC(PIA)2020中可能遇到的一些知识点

2023-11-08 14:20

本文主要是介绍ACLGUI IN SSTC(PIA)2020中可能遇到的一些知识点,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

文章目录

  • (一)条件编译
  • (二)部分头文件
  • (三)空指针
    • 具体操作示例
    • 常见问题1:空指针指向了内存的什么地方?
    • 常见问题2: 在实际的操作中,如何判断某个指针是不是空指针?
    • 常见问题3:可以定义自己的 NULL 的实现吗?
  • (四)new,delete与指针
    • new创建对象
    • delete销毁对象
  • (五)ACLLIB中部分函数的使用(未完成)
  • (六)template(未完成)
  • (七)作用域与extern(未完成)
    • 局部作用域
    • 全局作用域
    • extern关键字
  • (八)简单的文件操作(未完成)

(一)条件编译

一般情况下,C语言源程序中的每一行代码.都要参加编译。但有时候出于对程序代码优化的考虑.希望只对其中一部分内容进行编译.此时就需要在程序中加上条件,让编译器只对满足条件的代码进行编译,将不满足条件的代码舍弃,这就是条件编译(conditional compile)。

1.if格式

#if 表达式语句序列①
[#else语句序列②]
#endif

功能:当表达式的值为真时,编译语句序列①,否则编译语句序列②。其中,#else和语句序列②可有可无。

2.ifdef格式

#ifdef     标识符语句序列①
[#else语句序列②]
#endif

功能:当标识符已被定义时(用#define定义),编译语句序列①,否则编译语句序列②。其中#else和语句序列②可有可无。

3.ifndef格式

#ifndef     标识符语句序列①
[#else语句序列②]
#endif

功能:该格式功能与ifdef相反。

4.补充内容

#undef
作用:在后面取消以前定义的宏定义。
示例1:

#include <iostream.h>
#include<string.h>
#define MAX 5
#undef MAX
void main()
{char name[MAX]="abcd"; //最多四个字符,否则会提示说超出长度,原因是由于字符串末尾有'\0'字符cout<<"MAX = "<<MAX<<endl;for(int i=0;i<MAX;i++)cout<<name<<" "<<endl;
}

我们定义了MAX但又将其取消,会得到“未定义符号MAX”的错误提示。

示例2:

#include <stdio.h>
int main( void )
{
#define MAX 200printf("MAX= %d\n",MAX);
#undef MAX
#define MAX 300printf("MAX= %d\n",MAX);return 0;
}

我们可以像这样修改已经宏定义的符号常量的值。

示例3:

#define TEST_A 1
#define TEST_CLASS_A clase T1
#include "TEST.h"
#undef TEST_A
#undef TEST_CLASS_A

此段代码中,在头文件TEST.h中,这两个宏定义语句起作用,该头文件之后,它们就会释放掉。

(二)部分头文件

1.windows.h

Windows.h头文件封装了许多库函数以及一些类,将一些复杂的工作由库函数处 理,Windows.h头文件中包含了Windef.h、Winnt.h、Winbase.h、Winuser.h、Wingdi.h等头文件,涉及到了Windows内核API,图形界面接口,图形设备函数等重要的功能。
其中常用的函数包括休眠函数sleep(),清屏函数system(“cls”)等。

2.commctrl.h

一个包含大量接口的windows控件
具体内容参考commctrl.h

注:commctrl.h不能单独使用,在引入该头文件时,我们应该先加上#include<windows.h>

3.sstream

sstream,即字符串流,通常是用来做数据转换的。比如

int n=10000;
char s[10];
sprintf(s,%d”,n);// s中的内容为“10000”

详情可以参考sstream

4.ctime

见官网文献cmath

(三)空指针

空指针是一个被赋值为0的指针,在没有被具体初始化之前,其值为0。由系统保证空指针不指向任何实际的对象或者函数。同时,任何对象或者函数的地址都不可能是空指针。

具体操作示例

#define NULL 0
char *p = NULL;

注:先把要赋值的变量的地址赋给空指针,然后才能把变量的值赋给该指针。

常见问题1:空指针指向了内存的什么地方?

标准并没有对空指针指向内存中的什么地方这一个问题作出规定,也就是说用哪个具体的地址值表示空指针取决于系统的实现。我们常见的空指针一般指向 0 地址,即空指针的内部用全 0 来表示;也有一些系统用一些特殊的地址值或者特殊的方式表示空指针。
在实际编程中不需要了解在我们的系统上空指针到底是一个 zero null pointer 还是 nonzero null pointer,我们只需要了解一个指针是否是空指针就可以了——编译器会自动实现其中的转换,为我们屏蔽其中的实现细节。注意:不要把空指针的内部表示等同于整数 0 的对象表示,有时它们是不同的。

常见问题2: 在实际的操作中,如何判断某个指针是不是空指针?

可以通过与空指针常量或者其它的空指针的比较来实现(注意与空指针的内部表示无关)。
如果 p 是一个指针变量,
若进行: p = 0;、p = 0L;、p = ‘\0’;、p = 3 - 3;、p = 0 * 17; 中的任何一种赋值操作之后(对于 C 来说还可以是 p = (void*)0;),p 都成为一个空指针,并且由系统保证空指针不指向任何实际的对象或者函数。 反过来说,任何对象或者函数的地址都不可能是空指针。

指针变量 p 是空指针的判断:(假设 p 是一个指针变量,q 是一个同类型的空指针,要检查 p 是否是一个空指针)
if ( p == 0 )
if ( p == ‘\0’ )
if ( p == 3 - 3 )
if ( p == NULL ) /* 使用 NULL 必须包含相应的标准库的头文件 */
if ( NULL == p )
if ( !p )
if ( p == q )

常见问题3:可以定义自己的 NULL 的实现吗?

NULL 是标准库中的一个保留标识符。所以,如果包含了相应的标准头文件而引入了 NULL 的话,则再在程序中重新定义 NULL 为不同的内容是非法的,其行为是未定义的。

(四)new,delete与指针

在C++中,如果定义了对象,在内存中给它分配了空间;如果使用完以后,忘了销毁对象,即无法释放它所占用的内存空间。则这些内存空间一直被占用,直到重启计算机才可释放,这样就造成了内存泄露。

new创建对象

new操作符相当于一个函数,在内存分配完空间后,返回这个空间的首地址。

void main()
{  Point *p1=new Point(1,1);Point *p2=new Point(2,2);
}

delete销毁对象

用new命令可以为对象在内存中动态分配一定的空间,并返回分配空间的首地址;如果在程序运行结束之前没有用delete来销毁这些对象,释放它们所占用的空间也会发生内存泄露。

void main()
{Point *p1=new Point(1,1);Point *p2=new Point(2,2);delete p1;
}

指针p1所指向的对象因为调用了delete,则调用了析构函数,而销毁了对象;而指针p2指向的对象只是调用了new,而没有调用delete,没有被销毁,则发生了内存泄露。

因此,用new创建的对象都应当在程序内及时销毁。

(五)ACLLIB中部分函数的使用(未完成)

ACLLIB

(六)template(未完成)

函数模板定义一族函数。它声明一个通用的类模板,使之可以有一个或多个虚拟的类型参数。
函数模板的格式:

template< class T>(此处的T也可以用别的标识符替代)
prototype

函数模板在形式上分为两部分:模板、函数。在函数前面加上 template< class T>就成为函数模板,因此对函数的各种修饰(inline、constexpr 等)需要加在prototype上,而不是 template 前。

(七)作用域与extern(未完成)

局部作用域

全局作用域

对于对象而言(其他也是一样的),在main函数中,对象的作用域为他所在的最近的一对花括号内。在后花括号处析构函数被调用;全局的对象的作用域为声明之后的整个文件,析构函数在最后被调用。另外,临时产生的对象在使用完后立即会被析构。

extern关键字

extern

(八)简单的文件操作(未完成)

这篇关于ACLGUI IN SSTC(PIA)2020中可能遇到的一些知识点的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/370453

相关文章

基本知识点

1、c++的输入加上ios::sync_with_stdio(false);  等价于 c的输入,读取速度会加快(但是在字符串的题里面和容易出现问题) 2、lower_bound()和upper_bound() iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素。 iterator upper_bou

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

Anaconda 中遇到CondaHTTPError: HTTP 404 NOT FOUND for url的问题及解决办法

最近在跑一个开源项目遇到了以下问题,查了很多资料都大(抄)同(来)小(抄)异(去)的,解决不了根本问题,费了很大的劲终于得以解决,记录如下: 1、问题及过程: (myenv) D:\Workspace\python\XXXXX>conda install python=3.6.13 Solving environment: done.....Proceed ([y]/n)? yDownloa

STL经典案例(四)——实验室预约综合管理系统(项目涉及知识点很全面,内容有点多,耐心看完会有收获的!)

项目干货满满,内容有点过多,看起来可能会有点卡。系统提示读完超过俩小时,建议分多篇发布,我觉得分篇就不完整了,失去了这个项目的灵魂 一、需求分析 高校实验室预约管理系统包括三种不同身份:管理员、实验室教师、学生 管理员:给学生和实验室教师创建账号并分发 实验室教师:审核学生的预约申请 学生:申请使用实验室 高校实验室包括:超景深实验室(可容纳10人)、大数据实验室(可容纳20人)、物联网实验

C++语法知识点合集:11.模板

文章目录 一、非类型模板参数1.非类型模板参数的基本形式2.指针作为非类型模板参数3.引用作为非类型模板参数4.非类型模板参数的限制和陷阱:5.几个问题 二、模板的特化1.概念2.函数模板特化3.类模板特化(1)全特化(2)偏特化(3)类模板特化应用示例 三、模板分离编译1.概念2.模板的分离编译 模版总结 一、非类型模板参数 模板参数分类类型形参与非类型形参 非类型模板

枚举相关知识点

1.是用户定义的数据类型,为一组相关的常量赋予有意义的名字。 2.enum常量本身带有类型信息,即Weekday.SUN类型是Weekday,编译器会自动检查出类型错误,在编译期间可检查错误。 3.enum定义的枚举类有什么特点。         a.定义的enum类型总是继承自java.lang.Enum,且不能被继承,因为enum被编译器编译为final修饰的类。         b.只能定义

【408数据结构】散列 (哈希)知识点集合复习考点题目

苏泽  “弃工从研”的路上很孤独,于是我记下了些许笔记相伴,希望能够帮助到大家    知识点 1. 散列查找 散列查找是一种高效的查找方法,它通过散列函数将关键字映射到数组的一个位置,从而实现快速查找。这种方法的时间复杂度平均为(

找出php中可能有问题的代码行

前言 当你发现一个平时占用cpu比较少的进程突然间占用cpu接近100%时,你如何找到导致cpu飙升的原因?我的思路是,首先找到进程正在执行的代码行,从而确定可能有问题的代码段。然后,再仔细分析有问题的代码段,从而找出原因。 如果你的程序使用的是c、c++编写,那么你可以很容易的找到正在执行的代码行。但是,程序是php编写的,如何找到可能有问题的代码行呢?这个问题就是本文要解决的问题。 背景

【反射知识点详解】

Java中的反射(Reflection)是一个非常强大的机制,它允许程序在运行时检查或修改类的行为。这种能力主要通过java.lang.reflect包中的类和接口来实现。 通过反射,Java程序可以动态地创建对象、调用方法、访问字段,以及获取类的各种信息(如构造器、方法、字段等)。 反射的用途 反射主要用于以下几种情况: 动态创建对象:通过类的Class对象动态地创建其实例。访问类的字段