一、C++域操作符
首先看下面的这一段代码
#include <stdio.h> int value = 0; void printvalue() { printf("value = %d\n", value); } int main() { int value = 0; value = 1; printf("value = %d\n", value); ::value = 2; printvalue(); return 0; }
如果我们直接编译,编译器会报错,因为这是一个c文件,在c语言中还没有域操作符(::),但是只要我们改变了头文件。写成c++文件,然后编译就可以正常输出了。输出的结果是
value = 1 value = 2
本题的主要考点就是:
1、域操作符,域操作符是c++才加上的。
2、变量的作用域。
第一个value是全局变量,它的作用域是整个程序,然后又在main函数中定义了一个value,这是一个局部变量,这个变量会屏蔽同名的全局变量。所以在main函数里打印的就是value = 1。如果我们想用全局变量的value, 我们就得用域操作符来访问全局变量的value。
二、i++和++i的区别
i++ : 先使用i的值,i再自增
++i : i先自增, 再使用i自增之后的值。
两个版本的效率问题
如果使用的是基本的数据类型,两者的效率相同。
但是如果使用自己创建的数据类型,比如类,那么就是前置版本的效率高。因为前置版本可以直接返回对象的引用,但是后置版本需要反对对象的值,在返回的过程中会产生临时变量,需要复制,这样会产生较大的开销。
三、有符号数和无符号数之间的转换
在进行运算的时候我们需要注意运算对象的数据类型,如果不注意可能会出现意想不到的大麻烦。
我们来看下面这个例子
#include <stdio.h> char getChar(int x, int y) { char c; unsigned int a = x; (a + y > 10) ? (c = 1) : (c = 2); return c; } int main(void) { char c1 = getChar(7,4); char c2 = getChar(7,3); char c3 = getChar(7,-7); char c4 = getChar(7,-8); printf("c1 = %d\n", c1); printf("c2 = %d\n", c2); printf("c3 = %d\n", c3); printf("c4 = %d\n", c4); return 0; }上面一个函数的作用判断传进来的两个数相加是否大于10,但是这个时候我们需要注意加号运算符的两个运算对象。阅读上面的代码可知,a是一个unsigned int类型的,但是y的类型确实int类型的,这个时候回出现类型转换,有符号类型的转为无符号类型的。
有符号数转为无符号数
如果第一位不是1,那么无符号数就和原来的有符号数相同。
如果第一位是1, 那么将有符号数取补码,得到的数就是无符号数。
无符号数转为有符号数
如果第一位不是1,那么有符号数就和原来的无符号数相同。
如果第一位是1,那么将无符号数取补码,最后得到的数的第一位是符号位,其余的几位是这个有符号数的数值。
四、三种不同的交换的变量的方法
1、用一个中间变量。这也是大家常用的方法
void swap1(int &a, int &b) { int x; x = a; a = b; b = x; }
2、使用加减法来交换两个变量的值,这就不要借助中间变量了
void swap2(int &a, int &b) { a = a + b; b = a - b; //此时b就等于a; a = a - b; //此时减去上面一个b就相当于减掉了原来的a,剩下了原来的b。 }
3、使用按位运算符来交换两个变量,这个方法也不需要借助中间变量
void swap3(int &a, int &b) { a = a ^ b; b = a ^ b; a = a ^ b; }【注意】: 以上的传参都是引用传参的方式。
五、C和C++的区别和联系
区别
c和c++最主要的区别就是编程的思想不一样
c是面向过程编程
c++是面向对象编程
联系
我们也可用c++写出面向过程的程序,所以c++是c的超集。c++在c的基础上引入了类,重载、虚函数、模板和容器等。
六、#include<head.h>和#include“head.h”的区别
#include<head.h>表示这个头文件是一个标准头文件,编译器会在标准位置寻找这个文件,如果没有找到,编译器就会报错。
#include"head.h"表示这个头文件是我们自己定义的一个头文件,编译器首先会在我们的工程目录或者我们制定的位置寻找这个头文件,如果没有找到就会到标准位置找这个头文件,如果还是没有找到,那么编译器也会报错。