C/ C++ 常见编程问题
C 中容易忽略的问题
1、在C语言中,浮点型变量分为两类:
a. 单精度型:类型说明符为float, 在Turbo C 中占4个字节(32位)内存空间,其数值范围为3.4E-38~3.4E+38,可提供7位有效数字。
b. 双精度型:类型说明符为double, 在Turbo C 中占8个字节(64位)内存空间,其数值范围为1.7E-308~1.7E+308,可提供16位有效数字。
2、C语言中有4种存储类:自动变量、寄存器变量、静态变量、外部变量,分别有auto、register、static、extern 关键字来说明。
a. 自动变量用关键字auto进行说明,其作用域被限制在该变量出现的那一块内。只要那一块或包含在那一块里的任何块被执行,该变量就存在而且可以被引用。如果程序离开了那一块,该变量就不存在,当不需要它们时,它们不占据任何存储空间。(auto int a;)
b. 在CPU内部的寄存器中进行操作比在存储器上执行起来要快得多。当把一个变量说明为寄存器变量后,编译程序将尽可能地为该变量分配CPU内部的寄存器作为变量的存储单元,以加快运行速度。(register int a;)
3、静态变量的作用域:
在全局变量之前加上关键字static,全局变量就被定义成一个全局静态变量。全局静态变量的作用域与其他全局变量不同,全局静态变量在声明它的文件之外是不可见的,准确地说是从定义之处开始到文件结尾。
Test1.cpp #include <stdio.h>
void display();
extern int n;
void main(){
n=;
printf("%d\n",n);
display();
} Test2.cpp #include <stdio.h>
static int n;
void display(){
n++;
printf("%d\n",n);
}
文件分别编译通过,但link的时候test1.cpp中的变量n找不到定义,产生错误。一种解决方法是把display函数放到test1.cpp中,另一种方法是把n定义成全局变量,而不是全局静态变量。但全局变量需要初始化,而未经初始化的全局静态变量会被程序自动初始化为0.、
3、指针和函数参数
a. 函数的参数可以是整型、浮点型、字符型等数据类型,以这种方式传递实际参数给形式参数,传递过程是单向的值拷贝过程,形式参数的变化不会影响到实际参数的值,因此只能通过return 语句将函数的结果返回,无法返回多个值。如果一个函数需要有多个输出,可以将指针变量作为函数的参数,它的作用是将一个变量的地址传送给被调用函数的形参。
b. int a[10]; int *p = &a[10];
数组名和指针之间有一个区别:指针是变量,p=a 和 p++ 都是有意义的操作,但数组名是常量,不是变量,因此像a=p, a++ 或者 p = &a 之类的表达式都是非法的。
c. 使用指针时一定要避免指针定义后未赋值就引用。如果在定义时不知道赋什么值,可以用p=NULL赋初值,以避免引起灾难性错误。
C++常见编程问题
1、标准C++库中所有组件都是在一个被称为std的命名空间中声明和定义的,在采用标准C++的平台上使用标准C++库中的组件,只要写一个using 指示符:using namespace std; 就可以直接使用标准C++库中的所有成员。如果使用了命名空间std,则在使用#include编译预处理命令包含头文件时,必须去掉头文件的扩展名.h 否则会出错。
2、如果一个指针通过+ 、—等操作而改变了指向,那么再释放之前,应确保其回到原来的指向。对于本例,在循环中,每次循环时ptr++,循环结束后,ptr已经不是指向原来的内存空间,在delete时,没有使它回到原来的指向,导致错误。解决办法是在最初是“备份”一份。在释放时,直接释放该指针即可。
#include <stdio.h>
void main(){
int count;
printf("PLease input a number!");
scanf("%d",&count);
int * ptr = NULL;
if(count>){
ptr= new int [count];
for(int i=;i<=count;i++){
*ptr=i*i;
printf("%d\t",*ptr);
ptr++;
}
delete ptr;
}
}
如: 修改 int * pbak=ptr; ... ... ; delete pbak;
3、引用是C++中的一个特殊的数据类型描述,它使两个以上的变量名指向同一地址,对其中任一个变量的操作实际上都是对该地址单元进行的。引用运算符为&,其形式为: 数据类型 &引用变量名 = 变量名; 或 数据类型& 引用变量名 = 变量名; 或 数据类型 & 引用变量名 = 变量名; 使用引用时需要注意:
a. 在一行上声明多个引用型变量(函数)名时,要在每个变量(函数)名前都冠以&符号。 如 int & ref1 = num, & ref2 = num;
b. 引用被声明时必须进行初始化,除非是用作函数的参数或者返回值。为引用提供的初始值应为变量(包括对象).一旦引用被初始化,就不能改变引用的关系,引用不能用数据类型来初始化。
c. 不能有空引用,引用必须与合法的存储单元关联。
d. 由于引用没有地址,所以引用的引用,指向引用的指针或引用的数组都是不合法的,但可以说明对指针变量的引用,因为指针也是变量。
e. 可以用一个引用初始化另一个引用。例如:int num; int &ref1 = num; int & ref2 = ref1;
f. 要注意区分引用运算符和地址运算符的区别。
g. 函数的参数可以是引用。
h. 函数可以返回引用,函数调用可以作为左值。
i. 引用与指针有如下区别:i)引用被创建的同时必须被初始化,而指针则可以在任何时候被初始化; ii)不能有空引用,引用必须与合法的存储单元关联,而指针则可以是NULL; iii) 一旦引用被初始化,就不能改变引用的关系,而指针则可以随时改变所指的对象。
C/ C++ 常见编程问题的更多相关文章
- (转载)android开发常见编程错误总结
首页 › 安卓开发 › android开发 android开发常见编程错误总结 泡在网上的日子 / 文 发表于2013-09-07 13:07 第771次阅读 android,异常 0 编辑推荐:稀 ...
- C++常见编程--获取当前系统时间
C++常见编程--获取当前系统时间 文章首发https://www.cppentry.com 本文主要使用time() 及strftime() 函数 C++系统和时间相关的函数基本上都是使用C语言提供 ...
- javascript常见编程模式举例
近期买到手了一本<javascript框架设计>,具体介绍开发js框架所用到的知识.初读一点,乐帝脆弱的理论修养就暴露无遗了,所以专门加强理论修养,重看javascript编程模式的举例. ...
- Java编程最差实践(常见编程错误典范)
转载自 http://macrochen.iteye.com/blog/1393502 每天在写Java程序,其实里面有一些细节大家可能没怎么注意,这不,有人总结了一个我们编程中常见的问题.虽然一般 ...
- java面试之常见编程题
1.编程实现:二分搜索算法 解答: public class SearchTest { /** 被搜索数据的大小 */ private static final int size = 5000000; ...
- Spark常见编程问题解决办法及优化
目录 1.数据倾斜 2.TopN 3.Join优化 预排序的join cross join 考虑Join顺序 4.根据HashMap.DF等数据集进行filter 5.Join去掉重复的列 6.展开N ...
- PCL常见编程问题
1.如何获取pcd文件点云里点的格式,比如是pcl::PointXYZ还是pcl::PointXYZRGB等类型? #include <pcl/io/pcd_io.h> #include ...
- android开发常见编程错误总结
1.设置TextView的文本颜色 1 2 3 TextView tv; ... tv.setTextColor(R.color.white); 其实这样设置的颜色是 R.color.white的资源 ...
- c语言常见编程
//输入一个整数,然后按照原顺序输出相应字符 # import <stdio.h> void main() { void convert (int n); int a; printf (& ...
随机推荐
- toad 9.6和toad 12.1工具使用比较
toad是我工作中使用最频繁的软件之一,阴错阳差的把2个版本都装到了电脑上,使用过程中逐渐发现2者的差异,特此做下记录,以便提示自己和其他有需要的人们.(随时更新中······)由于能力有限,难免会有 ...
- dpkg ---- apt-get ------ aptitude 三种方式的区别 及命令格式
转自:http://blog.csdn.net/xiaoyanghuaban/article/details/22946987 dpkg绕过apt包管理数据库对软件包进行操作,所以你用dpkg安装过的 ...
- AngularJS之手动加载模块app和controller
使用ng的页面中一般都是使用模块自动加载,页面的结构一般是这样的 加载angularjs脚本 加载业务代码脚本(或者写在script标签中) html结构代码(带有ng指令) 就像这样 app.htm ...
- vim编辑器使用相关
alias 查看vi是否已经绑定vim 一.vim的块选择 v 字符选择 V 行选择 ctrl+v 快选择 y 复制选择的地方(p进行粘贴) d 删除选择的地方 二.vim多文件编辑 :n 编辑下一个 ...
- Python中optionParser模块的使用方法[转]
本文以实例形式较为详尽的讲述了Python中optionParser模块的使用方法,对于深入学习Python有很好的借鉴价值.分享给大家供大家参考之用.具体分析如下: 一般来说,Python中有两个内 ...
- lua遍历文件夹, zerobrane下载
参考的这个http://www.cnblogs.com/jiufangding/p/3931585.html,配合批处理. zerobrane下载(上一篇博客忘掉了): http://files.cn ...
- 029. aps.net中DataView中详细信息的跳转显示
点击当前页面的连接, 跳转到另一个页面, 然后进行更新删除等一系列操作 主要代码: <%@ Page Language="C#" AutoEventWireup=" ...
- numpy.distutils.system_info.NotFoundError: no lapack/blas resources found
python35用pip安装scipy的时候报错 numpy.distutils.system_info.NotFoundError: no lapack/blas resources found 原 ...
- Random:产生随机数的类
/* * Random:产生随机数的类 * * 构造方法: * public Random():没有给种子,用的是默认种子,是当前时间的毫秒值 * public Random(long seed):给 ...
- 每天一个Linux命令
每天一个Linux命令(1):ls命令 每天一个Linux命令(2):cd命令 每天一个Linux命令(3):pwd命令 每天一个 Linux 命令(4):mkdir 每天一个 Linux 命令(5) ...