zoukankan      html  css  js  c++  java
  • 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,全局变量就被定义成一个全局静态变量。全局静态变量的作用域与其他全局变量不同,全局静态变量在声明它的文件之外是不可见的,准确地说是从定义之处开始到文件结尾。

     1 Test1.cpp
     2 
     3 #include <stdio.h>
     4 void display();
     5 extern int n;
     6 void main(){
     7     n=20;
     8     printf("%d
    ",n);
     9     display();
    10 } 
    11 
    12 
    13 Test2.cpp
    14 
    15 #include <stdio.h>
    16 static int n;
    17 void display(){
    18     n++;
    19     printf("%d
    ",n);
    20 }

    文件分别编译通过,但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时,没有使它回到原来的指向,导致错误。解决办法是在最初是“备份”一份。在释放时,直接释放该指针即可。

     1 #include <stdio.h>
     2 void main(){
     3     int count;
     4     printf("PLease input a number!");
     5     scanf("%d",&count);
     6     int * ptr = NULL;
     7     if(count>0){
     8         ptr= new int [count];
     9         for(int i=1;i<=count;i++){
    10             *ptr=i*i;
    11             printf("%d	",*ptr);
    12             ptr++; 
    13         }
    14         delete ptr;
    15     }
    16 }

    如: 修改 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) 一旦引用被初始化,就不能改变引用的关系,而指针则可以随时改变所指的对象。

  • 相关阅读:
    Android拷贝工程不覆盖原工程的配置方法
    Android中BindService方式使用的理解
    getApplicationContext()、Activity.this、 getBaseContext区别
    深入理解ASP.NET MVC(4)
    深入理解ASP.NET MVC(1)
    深入理解ASP.NET MVC(2)
    深入理解ASP.NET MVC(目录)
    C# 代码优化
    NPOI 创建Excel 设置宽度 样式 颜色对比表
    2. Mysql数据库的入门知识
  • 原文地址:https://www.cnblogs.com/hoojjack/p/5300071.html
Copyright © 2011-2022 走看看