C++之旅 虚函数

时间:2022-05-07 12:33:45 其他范文 收藏本文 下载本文

C++之旅 虚函数((精选7篇))由网友“噜啦啦”投稿提供,以下是小编帮大家整理后的C++之旅 虚函数,供大家参考借鉴,希望可以帮助到您。

C++之旅 虚函数

篇1:C++之旅 虚函数

1、为什么了解决什么 多态指同一个实体同时具有多种形式,它是面向对象程序设计(OOP)的一个重要特征。如果一个语言只支持类而不支持多态,只能说明它是基于对象的,而不是面向对象的。C++中的多态性具体体现在运行和编译两个方面。运行时多态是动态多态,其具体引用的对象在运行时才能确定。编译时多态是静态多态,在编译时就可以确定对象使用的形式。(静态绑定和动态绑定) 多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。 C++中,实现多态有以下方法:虚函数,抽象类,覆盖,模板(重载和多态无关)。 多态就是允许方法重名 参数或返回值可以是父类型传入或返回。允许将子类类型的指针赋值给父类类型的指针。

其实如果是这样的目的话,函数指针也可以实现多态。或我们反过来虚函数就是通过类名查找其虚表指针*__vptr(void**)。

2、定义 简单地说,那些被virtual关键字修饰的成员函数,就是虚函数。它的一般实现模型是:每一个类(class)有一个虚表(virtual table),内含该class之中有作用的虚(virtual)函数的地址,然后每个对象有一个vptr,指向虚表(virtual table)的所在。 这个类大小就会多4个字节,这4个字节就是VTABLE的地址,这个类里的每个虚函数都是这个VTABLE数组的成员。

3、实现原理工作机制 我们只要有虚函数的类,编译器都会为这个类创建一个VTABLE,用它来保存该类的所有虚函数地址。我们叫其函数指针数组。这个数组每个元素就是虚函数的地址。编译器给VTABLE置入了一指针VPTR。VPTR就是VTABLE的入口地址。VPTR的值取决于对像内存的地址。 每个类其VTABLE是独立唯一的,也就是说当构造该派生类实例(对象)时,那么这个类会有一个virtual table,而每一个实例(对象)都会有一个virtual pointer(以下简称vptr)指向该类的virtual function tabl

4、例题:#include//www.realtoptv.com by zhangyj //======================================================== // 名字空间声明 //======================================================== using std::cout; using std::endl; //Y = 0.30R + 0.59G + 0.11B , U = 0.493(B-Y), V = 0.877(R-Y) //R = Y + 1.4075 *(V - 128) //G = Y – 0.3455 *(U –128) – 0.7169 *(V –128) //B = Y + 1.779 *(U – 128) //======================================================== //======================================================== class RGB2YUV { public: //默认构造函数 RGB2YUV(int r = 1, int g = 1, int b = 1) : m_r(r), m_g(g), m_b(b) { cout << RGB2YUV constructor called << endl; } //定义为虚函数 virtual int Y { return 0.30*m_r + 0.59*m_g + 0.11*m_b; } virtual int U() { return 0.493*( m_b - Y() ); } virtual int V() { return 0.877*(m_r - Y()); } //显示 void ShowY() { cout << Y volume is << Y() << endl; } void ShowU() { cout << U volume is << U() << endl; } void ShowV() { cout << V volume is << V() << endl; } protected: int m_r; int m_g; int m_b; }; //======================================================== //======================================================== class PS_RGB2YUV : public RGB2YUV { public: PS_RGB2YUV(int r, int g, int b) :RGB2YUV(r, g, b){} //定义为虚函数 virtual int Y() { return 0.30*m_r + 0.59*m_g + 0.11*m_b+1; } virtual int U() { return 0.493*(m_b - Y())+1; } virtual int V() { return 0.877*(m_r - Y())+1; } }; //======================================================== //函数名 :main //函数说明 虚函数的实现机制 //函数参数 :无 //返回值 :0 //======================================================== int main() { RGB2YUV Wyuv(32, 32, 32); //基类对象定义 PS_RGB2YUV Wyuv_offset(32, 32, 32); //派生类对象定义 //显示 Wyuv.ShowY(); Wyuv.ShowU(); Wyuv.ShowV(); //显示派生类对象 Wyuv_offset.ShowY(); Wyuv_offset.ShowU(); Wyuv_offset.ShowV(); //显示类的大小 cout << Wyuv's size is << sizeof(Wyuv) << endl; cout << Wyuv_offset's size is << sizeof(Wyuv_offset) << endl; system(pause); }

8、反汇编分析

//定义为虚函数 29: virtual int Y() 30: { 013C4AA0 55 push ebp 013C4AA1 8B EC mov ebp,esp 013C4AA3 81 EC CC 00 00 00 sub esp,0CCh 013C4AA9 53 push ebx 013C4AAA 56 push esi 013C4AAB 57 push edi 013C4AAC 51 push ecx 013C4AAD 8D BD 34 FF FF FF lea ediebp-0CCh] 013C4AB3 B9 33 00 00 00 mov ecx,33h 013C4AB8 B8 CC CC CC CC mov eax,0CCCCCCCCh 013C4ABD F3 AB rep stos dword ptr es:[edi] 013C4ABF 59 pop ecx 013C4AC0 89 4D F8 mov dword ptr [this],ecx //每个实例都有this,寄存器ECX里面的值作为this指针地址 31: return 0.30*m_r + 0.59*m_g + 0.11*m_b; 013C4AC3 8B 45 F8 mov eax,dword ptr [this] 013C4AC6 F2 0F 2A 40 04 cvtsi2sd xmm0,dword ptr [eax+4] 013C4ACB F2 0F 59 05 60 DC 3C 01 mulsd xmm0,mmword ptr ds:[13CDC60h] 013C4AD3 8B 4D F8 mov ecx,dword ptr [this] 013C4AD6 F2 0F 2A 49 08 cvtsi2sd xmm1,dword ptr [ecx+8] 013C4ADB F2 0F 59 0D C8 DC 3C 01 mulsd xmm1,mmword ptr ds:[13CDCC8h] 013C4AE3 F2 0F 58 C1 addsd xmm0,xmm1 013C4AE7 8B 55 F8 mov edx,dword ptr [this] 013C4AEA F2 0F 2A 4A 0C cvtsi2sd xmm1,dword ptr [edx+0Ch] 013C4AEF F2 0F 59 0D B0 DB 3C 01 mulsd xmm1,mmword ptr ds:[13CDBB0h] 013C4AF7 F2 0F 58 C1 addsd xmm0,xmm1 013C4AFB F2 0F 2C C0 cvttsd2si eax,xmm0 32: }

virtual int Y()//调了2次值 74: { 013C4A30 55 push ebp 013C4A31 8B EC mov ebp,esp 013C4A33 81 EC CC 00 00 00 sub esp,0CCh 013C4A39 53 push ebx 013C4A3A 56 push esi 013C4A3B 57 push edi 013C4A3C 51 push ecx 013C4A3D 8D BD 34 FF FF FF lea edi,[ebp-0CCh] 013C4A43 B9 33 00 00 00 mov ecx,33h 013C4A48 B8 CC CC CC CC mov eax,0CCCCCCCCh 013C4A4D F3 AB rep stos dword ptr es:[edi] 013C4A4F 59 pop ecx 013C4A50 89 4D F8 mov dword ptr [this],ecx //每个实例都有this,寄存器ECX里面的值作为this指针地址

75: return 0.30*m_r + 0.59*m_g + 0.11*m_b+1; 013C4A53 8B 45 F8 mov eax,dword ptr [this] //调其实例 013C4A56 F2 0F 2A 40 04 cvtsi2sd xmm0,dword ptr [eax+4] 013C4A5B F2 0F 59 05 60 DC 3C 01 mulsd xmm0,mmword ptr ds:[13CDC60h] 013C4A63 8B 4D F8 mov ecx,dword ptr [this] 013C4A66 F2 0F 2A 49 08 cvtsi2sd xmm1,dword ptr [ecx+8] 013C4A6B F2 0F 59 0D C8 DC 3C 01 mulsd xmm1,mmword ptr ds:[13CDCC8h] 013C4A73 F2 0F 58 C1 addsd xmm0,xmm1 75: return 0.30*m_r + 0.59*m_g + 0.11*m_b+1; 013C4A77 8B 55 F8 mov edx,dword ptr [this] //调其实例 013C4A7A F2 0F 2A 4A 0C cvtsi2sd xmm1,dword ptr [edx+0Ch] 013C4A7F F2 0F 59 0D B0 DB 3C 01 mulsd xmm1,mmword ptr ds:[13CDBB0h] 013C4A87 F2 0F 58 C1 addsd xmm0,xmm1 013C4A8B F2 0F 58 05 98 DD 3C 01 addsd xmm0,mmword ptr ds:[13CDD98h] 013C4A93 F2 0F 2C C0 cvttsd2si eax,xmm0 76: }

9、总结 A、dynamic(late ) binding和static(early) binding 的实现优缺点

B、内存布局的优缺点 C、多重继承性的角度看优缺点 D、有多少种实现方法可以实现同样的功能

篇2:C语言实验报告《函数》

C语言实验报告《函数》 -实习报告

学号:__________    姓名:__________    班级:__________    日期:__________指导教师:__________    成绩:__________实验四  函数一、 实验目的1、掌握函数定义、调用和声明的方法2、掌握实参和形参之间的'传递方式3、函数的嵌套调用二、 实验内容1、 写一个函数,将两个字符串连接。(习题8.6)2、 编写一个函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其他字符的个数,在主函数中输入字符串以及输出上述的结果。(习题8.9)3、 请将实验三中的实验内容三改正后,再改写成函数形式(排序部分)。物理实验报告 ・化学实验报告 ・生物实验报告 ・实验报告格式 ・实验报告模板三、 实验步骤与过程 四、程序调试记录

篇3:五、(C语言)函数

概述

在第一章中已经介绍过,C源程序是由函数组成的, 虽然在前面各章的程序中都只有一个主函数main, 但实用程序往往由多个函数组成。函数是C源程序的基本模块, 通过对函数模块的调用实现特定的功能。C语言中的函数相当于其它高级语言的子程序。 C语言不仅提供了极为丰富的库函数(如Turbo C,MS C 都提供了三百多个库函数),还允许用户建立自己定义的函数。用户可把自己的算法编成一个个相对独立的函数模块,然后用调用的方法来使用函数。

可以说C程序的全部工作都是由各式各样的函数完成的, 所以也把C语言称为函数式语言。 由于采用了函数模块式的结构, C语言易于实现结构化程序设计。使程序的层次结构清晰,便于程序的编写、阅读、调试。

在C语言中可从不同的角度对函数分类。

1. 从函数定义的角度看,函数可分为库函数和用户定义函数两种。

(1)库函数

由C系统提供,用户无须定义, 也不必在程序中作类型说明,只需在程序前包含有该函数原型的头文件即可在程序中直接调用。在前面各章的例题中反复用到printf 、 scanf 、 getchar 、putchar、gets、puts、strcat等函数均属此类。

(2)用户定义函数

由用户按需要写的函数。对于用户自定义函数, 不仅要在程序中定义函数本身, 而且在主调函数模块中还必须对该被调函数进行类型说明,然后才能使用。

2. C语言的函数兼有其它语言中的函数和过程两种功能,从这个角度看,又可把函数分为有返回值函数和无返回值函数两种。

(1)有返回值函数

此类函数被调用执行完后将向调用者返回一个执行结果, 称为函数返回值。如数学函数即属于此类函数。 由用户定义的这种要返回函数值的函数,必须在函数定义和函数说明中明确返回值的类型。

(2)无返回值函数

此类函数用于完成某项特定的处理任务, 执行完成后不向调用者返回函数值。这类函数类似于其它语言的过程。 由于函数无须返回值,用户在定义此类函数时可指定它的返回为“空类型”, 空类型的说明符为“void”。

3. 从主调函数和被调函数之间数据传送的角度看又可分为无参函数和有参函数两种。

(1)无参函数

函数定义、函数说明及函数调用中均不带参数。 主调函数和被调函数之间不进行参数传送。 此类函数通常用来完成一组指定的功能,可以返回或不返回函数值。

(2)有参函数

也称为带参函数。在函数定义及函数说明时都有参数, 称为形式参数(简称为形参)。在函数调用时也必须给出参数, 称为实际参数(简称为实参)。 进行函数调用时,主调函数将把实参的值传送给形参,供被调函数使用。

4. C语言提供了极为丰富的库函数, 这些库函数又可从功能角度作以下分类。

(1)字符类型分类函数

用于对字符按ASCII码分类:字母,数字,控制字符,分隔符,大小写字母等。

(2)转换函数

用于字符或字符串的转换;在字符量和各类数字量 (整型, 实型等)之间进行转换;在大、小写之间进行转换。

(3)目录路径函数

用于文件目录和路径操作。

(4)诊断函数

用于内部错误检测。

(5)图形函数

用于屏幕管理和各种图形功能,

(6)输入输出函数

用于完成输入输出功能。

(7)接口函数

用于与DOS,BIOS和硬件的接口。

(8)字符串函数

用于字符串操作和处理。

(9)内存管理函数

用于内存管理。

(10)数学函数

用于数学函数计算。

(11)日期和时间函数

用于日期,时间转换操作。

(12)进程控制函数

用于进程管理和控制。

(13)其它函数

用于其它各种功能。

以上各类函数不仅数量多,而且有的还需要硬件知识才会使用,因此要想全部掌握则需要一个较长的学习过程。 应首先掌握一些最基本、 最常用的函数,再逐步深入。由于篇幅关系,本书只介绍了很少一部分库函数, 其余部分读者可根据需要查阅有关手册。

还应该指出的是,在C语言中,所有的函数定义,包括主函数main在内,都是平行的。也就是说,在一个函数的函数体内, 不能再定义另一个函数, 即不能嵌套定义。但是函数之间允许相互调用,也允许嵌套调用。习惯上把调用者称为主调函数。 函数还可以自己调用自己,称为递归调用。main 函数是主函数,它可以调用其它函数,而不允许被其它函数调用。 因此,C程序的执行总是从main函数开始, 完成对其它函数的调用后再返回到main函数,最后由main函数结束整个程序。一个C源程序必须有,也只能有一个主函数main。

函数定义的一般形式

1.无参函数的一般形式

类型说明符 函数名()

{

类型说明

语句

}

其中类型说明符和函数名称为函数头。 类型说明符指明了本函数的类型,函数的类型实际上是函数返回值的类型。 该类型说明符与第二章介绍的各种说明符相同。 函数名是由用户定义的标识符,函数名后有一个空括号,其中无参数,但括号不可少。{} 中的内容称为函数体。在函数体中也有类型说明, 这是对函数体内部所用到的变量的类型说明。在很多情况下都不要求无参函数有返回值, 此时函数类型符可以写为void。

我们可以改为一个函数定义:

void Hello()

{

printf (“Hello,world n”);

}

这里,只把main改为Hello作为函数名,其余不变。Hello 函数是一个无参函数,当被其它函数调用时,输出Hello world字符串。

2.有参函数的一般形式

类型说明符 函数名(形式参数表)

型式参数类型说明

{

类型说明

语句

}

有参函数比无参函数多了两个内容,其一是形式参数表, 其二是形式参数类型说明。在形参表中给出的参数称为形式参数, 它们可以是各种类型的变量, 各参数之间用逗号间隔。在进行函数调用时,主调函数将赋予这些形式参数实际的值。 形参既然是变量,当然必须给以类型说明。例如,定义一个函数, 用于求两个数中的大数,可写为:

篇4:c语言函数天天见

总结在学习过程中遇到的c语言函数:

1、相关函数:fstat, lstat, chmod, chown, readlink, utime

头文件:#include#include

定义函数:int stat(const char * file_name, struct stat *buf);

函数说明:stat()用来将参数file_name 所指的文件状态, 复制到参数buf 所指的结构中,成功返回0,失败返回-1. stat结构体内详细信息不再赘述,可以参考其他博客资料。

使用方法:

struct stat sa;

if(stat(filename,&sa)<0)

{

return -1;

}

....

2、memset

总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c。

#include

using namespace std;

void main()

{

char s[20];

cout<<“s大小”<

3、rand(),RAND_MAX

rand()产生随机数的一个随机函数;

RAND_MAX是C中stdlib.h中宏定义的一个字符常量:

#define RAND_MAX Ox7FFF

其值最小为32767,最大为2147483647

通常在产生随机小数时可以使用RAND_MAX,

#include

#include

#include

using namespace std;

int main(void)

{

srand((unsigned int)time(NULL));

double a[10];

int i;

cout<

篇5:使用c函数实现的常用函数

/* strcat的实现 */

#include

char* my_strcat (char* strDest,const char* strSrc)

{

char *ret = strDest;

assert ((strDest != NULL) && (strSrc != NULL));

while (*strDest != '')

{

strDest++;

}

while ((*strDest++ = *strSrc++) != '')

{

}

*strDest = '';

return ret;

}

/* strcpy的实现 */

#include

char* my_strcpy (char* strDest, const char* strSrc)

{

assert ((strDest != NULL) && (strSrc != NULL));

char* address = strDest;

while ((*strDest++ = *strSrc++) != '')

{

}

return address;

}

/* split的实现 */

int my_split (char *strOld, char **strNew)

{

assert ((strOld != NULL) && (strNew != NULL));

char *emp = *strNew;

int res = 0;

for (;;)

{

if ((*strOld >= '0') && (*strNew <= '9'))

{

int j = *strOld - '0';

res = res * 10 + j;

strOld++;

}

else if ((*strOld >= 'A') && (*strOld <= 'z'))

{

*emp++ = *strOld;

strOld++;

}

else

{

break;

}

}

return res;

}

/* strcmp的实现 */

int my_strcmp (const char *strDest, const char* strSrc)

{

while (*strDest)

{

if (*strDest != *strSrc)

{

return (*strDest - *strSrc) > 0 ? 1 : -1;

}

strDest++;

strSrc++;

}

if (*strDest)

{

return -1;

}

else

{

return 0;

}

}

/* string 转换为int */

int my_atoi (const char *str)

{

int result = 0;

int sign = 1;

if ('0' <= str[0] && str[0] <= '9' || (str[0] == '-') || (str[0] == '+'))

{

if (str[0] == '+' || str[0] == '-')

{

if (str[0] == '-')

{

sign = -1;

}

else

{

str++;

}

}

}

while (*str>='0' && *str<='9')

{

result = result * 10 + (*str - '0');

str++;

}

return result * sign;

}

/* int 转换为16进制 */

void my_itoa (char *buffer, unsigned int num)

{

int i;

unsigned int tmp;

buffer[0] = '0';

buffer[1] = 'x';

i = 9;

while (num)

{

tmp = num % 16;

if (tmp >= 10)

{

buffer[i] = tmp - 10 + 'A';

}

else

{

buffer[i] = tmp + '0';

}

i--;

num /= 16;

}

while (i >= 2)

{

buffer[i--] = '0';

}

buffer[10] = 0;

}

/* 字符串逆序 */

int str_reversed(char *str)

{

int i = 0;

char temp = 0;

char *ps;

char *pe;

if (!str)

{

return -1;

}

ps = a;

while (*a != 0)

{

a++;

}

pe = a;

for (i=0; i<(pe-ps)/2;i++)

{

temp = *(ps+i);

*(ps+i) = *(pe-i-1);

*(pe-i-1) = temp;

}

return 0;

}

/* 冒泡排序 */

void bubble_sort (int arr[], int size)

{

int i,j,flag,temp;

for (i=1; i<=size-1; i++)

{

flag = 0;

for (j=0; j<=size-i-1; j++)

{

if (arr[j] > arr[j+1])

{

flag = 1;

temp = arr[i];

arr[i] = arr[i+1];

arr[i+1] = temp;

}

if (flag == 0)

{

break;

}

}

}

}

/* 链表逆序*/

list reverse_list (list n)

{

if (!n)

{

return n;

}

list cur = n.next;

list pre = n;

list tmp;

pre.next = NULL;

while (NULL != cur.next)

{

tmp = cur;

tmp.next = pre;

pre = tmp;

cur = cur.next;

}

return tmp;

}

/* 判断是否是质数(素数) */

int is_prime (int n)

{

int i;

if (n < 2) return 0;

if (n == 2) return 1;

//判断时只需判断到n的开方即可

for (i=2; i*i<=n; i++)

{

if (n%i == 0) return 0;

}

return 1;

篇6:C语言调用Lua函数

记得上学时,初中英文课本中,上网叫做surfing the internet,中文叫网上冲浪,那个时期,人们经常称互联网为赛博空间。如今工作了,大量的零碎时间用于上微博,知乎,QQ,这些碎片化的阅读让人读起来轻松,也能获取些粗浅的信息。然而它们是消耗时间的黑洞,时间就这样一分一秒地飞逝,年末的时候,知乎会告诉你回答了多少问题,阅读了相当于一部《红楼梦》那么多的文字。只是当你静下来一想,这些浅阅读并没给你带来有深度,系统的知识。在你的时间线上,两条相邻信息往往是八竿子也打不着的。而且你还时不时去看看关注者有没有更新,期待让你眼前一亮的信息。结果往往是趁兴而去,败兴而回。屏幕上的信息永无止境地滚动着,是如此的热闹,仿佛每个人都在狂欢,而我的内心却如此的空虚与孤独。

在lua API中,调用一个函数的步骤很简单:1.压入你要调用的函数,使用lua_getglobal。2.压入调用参数。3.使用lua_pcall4.从栈中弹出结果。

举例说明,假设你有这么一个lua函数:function f (x, y)

return (x^2 * math.sin(y))/(1 - x)

end

那么,我们就可以定义个c函数来封装这个调用:/* call a function ‘f‘ defined in Lua */

double f (double x, double y) {

double z;lua_getglobal(L, “f”); lua_pushnumber(L, x); lua_pushnumber(L, y); /* do the call (2 arguments, 1 result) */if (lua_pcall(L, 2, 1, 0) != 0) error(L, “error running function ‘f‘: %s”,lua_tostring(L, -1));

if (!lua_isnumber(L, -1)) error(L, “function ‘f‘ must return a number”);z = lua_tonumber(L, -1);lua_pop(L, 1); return z;}

lua_pcall在压入结果的之前,会将函数,和参数弹出,如果返回多个结果,第一个最先压入,

如果lua_pcall运行出错,那么会返回个非0值。(完)

篇7:c语言函数知识点总结

第一节、对C语言的基础认识

1、C语言编写的程序称为源程序,又称为编译单位。

2、C语言书写格式是自由的,每行可以写多个语句,可以写多行。

3、一个C语言程序有且只有一个main函数,是程序运行的起点。

第二节、熟悉vc++

1、VC是软件,用来运行写的C语言程序。

2、每个C语言程序写完后,都是先编译,后链接,最后运行。(.c—.obj—.exe)这个过程中注意.c和.obj文件时无法运行的,只有.exe文件才可以运行。(常考!)

第三节、标识符

1、标识符(必考内容):

合法的要求是由字母,数字,下划线组成。有其它元素就错了。

并且第一个必须为字母或则是下划线。第一个为数字就错了

2、标识符分为关键字、预定义标识符、用户标识符。

关键字:不可以作为用户标识符号。main define scanf printf 都不是关键字。迷惑你的地方If是可以做为用户标识符。因为If中的第一个字母大写了,所以不是关键字。

预定义标识符:背诵define scanf printf include。记住预定义标识符可以做为用户标识符。

用户标识符:基本上每年都考,详细请见书上习题。

第四节:进制的转换

十进制转换成二进制、八进制、十六进制。

二进制、八进制、十六进制转换成十进制。

第五节:整数与实数

1)C语言只有八、十、十六进制,没有二进制。但是运行时候,所有的进制都要转换成二进制来进行处理。(考过两次)

a、C语言中的八进制规定要以0开头。018的数值是非法的,八进制是没有8的,逢8进1。

b、C语言中的十六进制规定要以0x开头。

2)小数的合法写法:C语言小数点两边有一个是零的话,可以不用写。

1.0在C语言中可写成1.

0.1在C语言中可以写成.1。

3)实型数据的合法形式:

a、2.333e-1 就是合法的,且数据是2.333×10-1。

b、考试口诀:e前e后必有数,e后必为整数。请结合书上的例子。

4) 整型一般是4个字节, 字符型是1个字节,双精度一般是8个字节:

long int x; 表示x是长整型。

unsigned int x; 表示x是无符号整型。

第六、七节:算术表达式和赋值表达式

核心:表达式一定有数值!

1、算术表达式:+,-,*,/,%

考试一定要注意:“/” 两边都是整型的话,结果就是一个整型。 3/2的结果就是1.

“/” 如果有一边是小数,那么结果就是小数。 3/2.0的结果就是0.5

“%”符号请一定要注意是余数,考试最容易算成了除号。)%符号两边要求是整数。不是整数就错了。[注意!!!]

2、赋值表达式:表达式数值是最左边的数值,a=b=5;该表达式为5,常量不可以赋值。

1、int x=y=10: 错啦,定义时,不可以连续赋值。

2、int x,y;

x=y=10; 对滴,定义完成后,可以连续赋值。

3、赋值的左边只能是一个变量。

4、int x=7.7;对滴,x就是7

5、float y=7;对滴,x就是7.0

3、复合的`赋值表达式:

int a=2;

a*=2+3;运行完成后,a的值是12。

一定要注意,首先要在2+3的上面打上括号。变成(2+3)再运算。

4、自加表达式:

自加、自减表达式:假设a=5,++a(是为6), a++(为5);

运行的机理:++a 是先把变量的数值加上1,然后把得到的数值放到变量a中,然后再用这个++a表达式的数值为6,而a++是先用该表达式的数值为5,然后再把a的数值加上1为6,

再放到变量a中。 进行了++a和a++后 在下面的程序中再用到a的话都是变量a中的6了。

考试口诀:++在前先加后用,++在后先用后加。

5、逗号表达式:

优先级别最低。表达式的数值逗号最右边的那个表达式的数值。

(2,3,4)的表达式的数值就是4。

z=(2,3,4)(整个是赋值表达式) 这个时候z的值为4。(有点难度哦!)

z= 2,3,4 (整个是逗号表达式)这个时候z的值为2。

补充:

1、空语句不可以随意执行,会导致逻辑错误。

2、注释是最近几年考试的重点,注释不是C语言,不占运行时间,没有分号。不可以嵌套!

3、强制类型转换:

一定是 (int)a 不是 int(a),注意类型上一定有括号的。

注意(int)(a+b) 和(int)a+b 的区别。 前是把a+b转型,后是把a转型再加b。

4、三种取整丢小数的情况:

1、int a =1.6;

2、(int)a;

3、1/2; 3/2;

第八节、字符

1)字符数据的合法形式::

‘1’ 是字符占一个字节,”1”是字符串占两个字节(含有一个结束符号)。

‘0’ 的ASCII数值表示为48,’a’ 的ASCII数值是97,’A’的ASCII数值是65。

一般考试表示单个字符错误的形式:’65’ “1”

字符是可以进行算术运算的,记住: ‘0’-0=48

大写字母和小写字母转换的方法: ‘A’+32=’a’ 相互之间一般是相差32。

2)转义字符:

转义字符分为一般转义字符、八进制转义字符、十六进制转义字符。

一般转义字符:背诵、 、 ’、 ”、 。

八进制转义字符: ‘141’ 是合法的, 前导的0是不能写的。

十六进制转义字符:’x6d’ 才是合法的,前导的0不能写,并且x是小写。

3、字符型和整数是近亲:两个具有很大的相似之处

char a = 65 ;

printf(“%c”, a); 得到的输出结果:a

printf(“%d”, a); 得到的输出结果:65

第九节、位运算

1)位运算的考查:会有一到二题考试题目。

总的处理方法:几乎所有的位运算的题目都要按这个流程来处理(先把十进制变成二进制再变成十进制)。

例1: char a = 6, b;

b = a<<2; 这种题目的计算是先要把a的十进制6化成二进制,再做位运算。

例2: 一定要记住,异或的位运算符号” ^ ”。0 异或 1得到1。

0 异或 0得到0。两个女的生不出来。

考试记忆方法:一男(1)一女(0)才可以生个小孩(1)。

例3: 在没有舍去数据的时候,<<左移一位表示乘以2;>>右移一位表示除以2。

c语言笔试题目及答案

面试网络工程师的题目

常见华为面试题

C++多重继承的指针问题

阿里实习转正面试总结

面试计算机笔试之嵌入式问答

每年省电300万度 阿里云推行绿色云数据中心

C++笔试经验

C笔试题及答案

趋势科技的笔试题目

C++之旅 虚函数
《C++之旅 虚函数.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

【C++之旅 虚函数(精选7篇)】相关文章:

搜狐编程笔试真题2023-10-16

一些网易笔试题2023-08-13

财务招聘笔试题2022-06-30

上海万国商业网笔试题2022-12-23

华为面试流程2022-05-06

百度云、阿里云、盛大云和腾讯云哪个适合托管网站?2022-06-30

工程师-从物质财富的创造者到可持续发展的实践者2022-12-13

计算机二级答案2022-05-04

羊城晚报校招笔试题2023-06-22

经典数据结构笔试题及答案2023-07-11

点击下载本文文档