C++学习(61)

来源:互联网 发布:单片机控制蓝牙模块 编辑:程序博客网 时间:2024/06/05 17:55

1. 析构函数没有参数,无返回值。名字和类名相同。前面加一个~。


2. 以下程序的K最终值为:90

inti=10;

intj=20;

intk=3;

K *=i+j’

*=表示将第一个操作数的值与第二个操作数的值相乘;将结果存储在第一个操作数指定的对象中.而且根据运算符优先级:+优先级 大于*=优先级,

 

3.下面的C语言语句,哪一个可以把一个32位变量的最高位置为1且保持其它位不变?

A.        reg32|=1<<31;

B.        reg32&=1<<31;

C.        reg32&=~(1<<31);

D.        reg32^=1<<31;

 分析:|是按位或运算,<<是左移运算,1的二进制是0000 0000 0000 0000 0000 0000 0000 0001(int 类型占4个字节,每个字节8位); 
       1<<31的意思是将1的二进制左移31位,即将0000 0000 0000 0000 0000  0000 0000 0001  整体左移31位,右边的补零。
  结果为1000 0000 0000 0000 0000 0000 0000 0000。
        reg32|=<<32;的意思是reg和1000 0000 0000 0000 0000 0000 0000 0000按位或,并将结果赋给reg32。相当于reg32=reg32 |(1<<31)。


4.关于C语言值得vliatile关键字,下面说法哪一个是错误的(B)

A 编译器会禁止对volatile修饰的变量进行读写优化

B 用volatile修饰的变量,读取速度更快

C 每一次读取volatile修饰的变量都会从内存中读取

分析:volatile提醒编译器它后面所定义的变量随时都有可能改变 ,因此编译后的程序每次需要存储或读取这个变量的时候 ,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储, 可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。


分析二:1> 告诉compiler 不能做任何优化 
2> 用volatile 定义的变量会在程序外被改变,每次都必须从内存中读取,而不能重复使用放在cache或寄存器中的备份。

C语言中volatile关键字的作用


5.分析下列程序:

#include<iostream>using namespace std;int main() { const int a=10; int *p=(int *)(&a); *p=20; cout<<"a="<<a<<",*p"<<*p<<endl; return 0;}
输出结果: a=10,*p=10;

分析:因为a 和p都指向相同的内存地址,所以输出的前两个结果是相同的,但为啥相同的内存里的结果不相同么?--这就是常量折叠. 

这个"常量折叠"是 就是在编译器进行语法分析的时候,将常量表达式计算求值,并用求得的值来替换表达式,放入常量表。可以算作一种编译优化。 
因为编译器在优化的过程中,会把碰见的const全部以内容替换掉(跟宏似的: #define pi 3.1415,用到pi时就用3.1415代替),这个出现在预编译阶段;但是在运行阶段,它的内存里存的东西确实改变了!!! 
简单的说就是,当编译器处理const的时候,编译器会将其变成一个立即数。 


 分析二:其实这道题真正的答案是不确定的,他与编译器有关,在C++标准中并没有强制规定将一个const 常量转换为一个非const后应该怎么办,这个是交给编译器设计者来决定的,以VS为例子,如果建立的是.c文件,也就是在纯c的环境下编译该代码,输出的结果将会是20 20,但是如果是C++则是10,20。它真正的处理原理如下,a作用域下在C++中所有的常量a在预编译阶段就已经做了类似于宏替换的工作,所以输出的是它的常量值,但是如果你进去调试就会发现变量a的地址与p地址相同,且p指向的地址的内容已经修改为了20,也就是说其实我们对这部分地址的内容已经做出了修改,所以*p输出的是20。但是在纯C的环境下,它并没有类似于宏替换的那一步,所以它输出的就是修改后的值。 



原创粉丝点击