C/C++ 语言要注意的一些问题

1,关键字volatile函数

<!-- lang: cpp -->
   long square(volatile int x) 
   {   //int a=x;
    return a*a;
    }    在此输入代码

通过编译器优化后可能代码变为优化

<!-- lang: cpp -->
 long square(volatile int x) 
 {   int a=x;
     int b=x;
    return a*a;
  }

由于变量x可能被意想不到的改变,因此不必定获得x的平方值。 应该把代码变为编码

<!-- lang: cpp -->
 long square(volatile int x) 
 {   int a=x;
    return a*a;
  }

2,malloc(0)的返回值 malloc(0)返回堆上的任意一个字节的地址,而且返回的地址空间能够对其进行操做。指针


3,typedef和#define 定义数据类型的别名,哪一个最好 最好用typedef,缘由以下:code

<!-- lang: cpp -->
typedef struct str * tpstr;
#define struct str * dpstr

当定义变量时,tpstr s1,s2;定义的都是指针变量。 而 dpstr s1,s2;至关于struct str * s1,s2; s1是指针变量,s2是结构变量,不是本身最初想要的。对象


4,无符号数和有符号运算,结果为无符号,无符号和有符号数最好不要混用!内存中的编码为补码!正数为它自己,负数为补码(反码加1).继承


5,64 位机上的 64 位类型是什么样的?内存

C99 标准定义了 long long 类型, 其长度能够保证至少 64 位, 这种类型在某些 编译器上实现已经很有时日了。其它的编译器则实现了相似 longlong 的扩展。原型


6,怎样定义和声明函数和全局变量? 首先要理解定义和声明的概念,二者的区别是定义要分配存储空间,声明告诉编译器要使用 某个变量类型和名字。同一个变量只能定义一次(能够指定初值),但能够声明屡次。 例如,int a ,声明的时候就创建了存储空间。这是定义性声明,就是定义。 而 extern int a ,只是声明变量a在别的文件中定义了,是一种引用声明,因此说声明包含着定义,定义是声明的特例。 函数的声明和定义比较简单,不加“{}”就是声明,加“{}”就是定义。 而一般函数、变量的声明和定义都是分开在不一样文件,声明放在.h头文件中,而定义是包含头文件放在.c中。编译器


7,C 如何模拟继承等面向对象的程序语言的方法? 因为能够定义函数指针,所以定义的结构体直接加入函数指针就能够实现简单的方法,结构体进行简单的嵌套,就能够实现简单的继承!


8,这样的代码能不能被执行:a[i]=i++; 不能执行,缘由i++表达式有一个反作用,改变i的值,因为i在同一表达式被其余地方引用,致使无定义的结果,没法判断该值是旧值仍是新值。


9,可否用括号来强制改变函数的调用顺序 例如 f1()+f2()*f3();尽管咱们知道运算规则是先算乘法再算加法,但咱们并不知道三个函数的调用顺序,若是想得到咱们指望的结果,只有使用独立语句和明确的临时变量。


10,两个整数相除结果为整数,整数才可求余,余数的符号与左边数的符号相同。


11,C++中的内联函数,定义方法是:在函数定义时,在函数的类型前增长修饰词inline。 其实质
是用存储空间(把代码插入到函数调用处)来减小执行时间。 使用内联函数要注意的问题:


1、C++中,除在函数体内含有循环,switch分支和复杂嵌套的if语句外,全部的函数都可定义为内联函数。


2、内联函数也要定义在前,调用在后。形参与实参之间的关系与通常的函数相同。


3、对于用户指定的内联函数,编译器是否做为内联函数来处理由编译器自行决定。说明内联函数时,只是请求编译器当出现这种函数调用时,做为内联函数的扩展来实现,而不是命令编译器要这样去作。


4、正如前面所述,内联函数的实质是采用空间换取时间,便可加速程序的执行,当出现屡次调用同一内联函数时,程序自己占用的空间将有所增长。如上例中,内联函数仅调用一次时,并不增长程序占用的存储间。


12,关于C++的参数


1、参数能够有缺省值,但不能够靠左边缺省。

<!-- lang: cpp -->
void f(int a,int b=20);

2、函数原型说明时参数能够没有变量名。

<!-- lang: cpp -->
void f(int,long b,int c=20);

3、只能在前面定义一次缺省值,即原型说明时定义了缺省值,后面函数的定义不可有缺省值。


4、关于可变参数,前面的介绍都是参数数目固定的参数,可是在某些时候,函数参数个数并不能肯定,而在调用的时候才肯定,针对这种状况,C++定义容许参数个数不固定的函数。


首先,要用到va_start()、va_arg()、 va_end()这三个库函数,必须包含头文件“stdarg.h”,。


其次,要说明一个va_list类型的变量,va_list与int,float类同,它是C++系统预约义的一个数据类型(非float),只有经过这种类型的变量才能从实际参数表中取出可变有参数。如定义下面函数:

<!-- lang: cpp -->
  void fun(int a,int b,...){ //其中"..."表示可变参数,而可变参数前面是肯定的参数b
  va_list   ap;
  va_start(ap,b);           //初始化,从肯定参数b开始取可变参数
  int temp=va_arg(ap,int);          //依次取参数,int为可变参数的数据类型名
  va_end(ap);             //完成收尾工做
 }

使用参数数目可变的函数时要注意如下几点:


1、在定义函数时,固定参数部分必须放在参数表的前面,可变参数在后面,并用省略  号“...”表示可变参数。在函数调用时,能够没有可变的参数。

2、必须使用函数va_start()来初始化可变参数,为取第一个可变的参数做好准备工做;使用函数va_arg()依次取各个可变的参数值;最后用函数va_end()作好结束工做,以便能正确地返回。

3、在调用参数个数可变的函数时,一定有一个参数指明可变参数的个数或总的实参个数。

13,C++运算符的重载,当用成员函数实现运算符的重载时,运算符重载函数的参数只能有二种状况:没有参数或带有一个参数。对于只有一个操做数的运算符(如++),在重载这种运算符时,一般不能有参数;而对于有二个操做数的运算符,只能带有一个参数。这参数能够是对象,对象的引用,或其它类型的参数。在C++中不容许重载有三个操做数的运算符。

相关文章
相关标签/搜索