当前位置: 首页 > 编程日记 > 正文

读书笔记之知识杂点

1.x=x+1,x+1,x++,哪个效率最高?为什么?

x=x+1最低,因为它的执行过程如下:

(1)读取右x的地址

(2)x+1

(3)读取左x的地址

(4)将右值传给左边的x(编译器并不认为左右的x的地址相同)

x+=1其次,其执行过程如下:

(1)读取右x的地址

(2)x+1

(3)将得到的值传给x(因为x的地址已经读出)

x++效率最高,其执行过程如下

(1)读取右x的地址

(2)x自增1

2.

#define product(x) (x*x)

int main()

{
       
int i = 3,j,k;

       j 
= product(i++);

       k 
= product(++i);

       printf(“j 
= %d,k = %d",j,k);

       
return 0;  
}

输出结果是什么?

product(i++) = i++*i++;i = 3,先取i计算,然后i自加2次,所以j等于9,此时i等于5.product(++i)要求先累加i,累积后i等于7,所以product(++i)的结果是49.

3.A://a is a variable

写法1:

if(‘A’ == a)

ExpandedBlockStart.gifContractedBlock.gif
{

      a
++;

}

写法2:

if(a == ‘A’)

ExpandedBlockStart.gifContractedBlock.gif
{

      a
++;

}

B:

写法1:

for(i = 0;i<8;i++)

ExpandedBlockStart.gifContractedBlock.gif
{

     X 
= i+Y+J*7;

     printf(“
%d”,X);     

}

写法2:

= Y+J*7;

for(i = 0;i<8;i++)

ExpandedBlockStart.gifContractedBlock.gif
{

     printf(“
%d”,i+S); 

}

A和B中各有两种写法,其中那一种写法比较好?

A.写法1好,'A’ == a,如果把"=="误写为"="的话,因为编译器不允许对常量赋值,就可以检查到错误。

B.写法2好,将部分加法运算放到了循环体外,提高了效率。缺点是程序不够简洁。

3.

unsigned int a = 3;

int b = –5;

(a
+b>0)?a++:b++;

cout
<<a<<endl;

cout
<<b<<endl;

则输出a,b的值为多少?

a = 4;

b = –5;

a是unsigned int型的,再与b相加时,b转换为unsigned型的,故结果为4294967295而不是-2。

4.在C++程序中调用被C编译器编译后的函数,为什么要加extern “C”?

C++语言支持函数重载,C语言不支持函数重载。函数被C++编译后在库中的名字与C语言的不同。假设某个函数的原型为:void foo(int x,int y)。该函数被C编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字。

C++提供了C连接交换指定符号extern “C” 解决名字匹配问题。

5.如何判断一段程序是由C编译程序还是由C++编译程序编译的?

C++编译时定义了_cplusplus。

C编译时定义了STDC。

6.main主函数执行完毕后,是否可能会在执行一段代码?

如果需要加入一段在main退出后执行的代码,可以使用atexit()函数注册一个函数:

#include<iostream> 
#include
<stdlib.h> 

using namespace std; 

//int atexit(void (*function)(void)); 

void fun1(),fun2(),fun3(),fun4(); 

int main() 
ExpandedBlockStart.gifContractedBlock.gif

    atexit(fun1); 
    atexit(fun2); 
    atexit(fun3); 
    atexit(fun4); 
    printf(
"This is excute first.\n"); 
}
 

void fun1() 
ExpandedBlockStart.gifContractedBlock.gif

    printf(
"Next.\n"); 
}
 

void fun2() 
ExpandedBlockStart.gifContractedBlock.gif

    printf(
"excute "); 
}
 

void fun3() 
ExpandedBlockStart.gifContractedBlock.gif

    printf(
"is "); 
}
 

void fun4() 
ExpandedBlockStart.gifContractedBlock.gif

    printf(
"This "); 
}


atexit()用来设置一个程序正常结束前调用的函数。当程序通过调用exit()或从main中返回时,参数function所指定的函数会先被调用,然后才真正由exit()结束程序。

如果执行成功则返回0,否则返回-1,失败原因存于errno中。

7.宏定义,下面的代码输出结果是什么?

#define SQR(x) (x*x)

main()

ExpandedBlockStart.gifContractedBlock.gif
{

      
int a,b=3;

      a 
= SQR(b + 2);

      printf(“\n
%d”,a);

}


结果应为11

宏定义展开时容易造成二义性问题。a = SQR(b + 2)这一语句展开后为"b + 2 * b + 2”,而不是想象中的"(b + 2)*(b + 2)"。要是先得到这个结果必须把宏定义语句改为如下的形式:

#define SQR(x) ((x)*(x))

这样输出的结果为25。

8.程序的输出结果是什么?

#include <iostream>

using namespace std;

char* GetMemory()

ExpandedBlockStart.gifContractedBlock.gif
{

      
char p[] = “Hello world”;

      
return p;

}


int main()

ExpandedBlockStart.gifContractedBlock.gif
{

      
char *ch = NULL;

      ch 
= GetMemory();

      cout
<<ch;

      
return 0;

}


程序输出可能是乱码,也可能正常输出,因为GetMemory返回的是指向"栈内存"的指针,该指针的地址不是NULL,但其原来的内容已经被清除,新内容不可知。

9.函数指针:void (*p)()

函数返回指针:void * p()

const指针:const int *

指向const的指针:int * const

指向const的const指针:const int * const

10.int a[9] = {0,1,2,3,4,5,6,7,8};

int *p = a;

数组名代表数组的首地址,是一个常量指针,是不可以修改的,a++是错误的,p是个指针变量是可以修改的,如同时表示a[1]的话,可表示为*(a+1),*(p+1),*(++p)

11.

ExpandedBlockStart.gifContractedBlock.gifstatic int a[3][3= {1,3,5,7,9,11,13,15,17},y,x,*= &a[2][2];

for(x = 0;x<3;x++)

     y 
+= *(p – 4 * x);

printf(“\n
%d”,y);

输出结果是什么?

27,三次循环相加的数分别为17 + 9 + 1,p - n相当于p的地址减去n*4(整型类型的大小).

12.float (**def)[10]

def是一个二级指针,它指向的是一个一维数组的指针,数组的元素都是float。

double *(*gh)[10]

gh是一个指针,它指向一个一维数组,数组元素都是double*。

double (*f[10])()

f是一个数组,f有10个元素,元素都是函数的指针,指向的函数类型是没有参数且返回double的函数。

int *((*b)[10])

就跟"int *(*b)[10]”是一样的,b是一维数组的指针。

Long (*fun)(int)

函数指针。

int (*(*F)(int,int))(int)

F是一个函数的指针,指向的函数的类型是有两个int参数并且返回一个函数指针的函数,返回的函数指针指向又一个int参数且返回int的函数。

13.句柄地址(稳定)->记载着对象在内存中的地址->对象在内存中的地址(不稳定)->实际对象。

14.一个射击运动员打靶,靶一共有10环,连开10枪打中90环的可能性有多少种?使用递归实现

#include <iostream> 
using namespace std; 
int sum; 
int store[10]; 
void Output() 
ExpandedBlockStart.gifContractedBlock.gif

    
for(int i = 9;i>=0;--i) 
ExpandedSubBlockStart.gifContractedSubBlock.gif    

        cout
<<store[i]<<" "
    }
 
    cout
<<endl; 
    
++sum; 
}
 

void Cumput(int score,int num) 
ExpandedBlockStart.gifContractedBlock.gif

    
if(score<0||score>(num+1)*10
ExpandedSubBlockStart.gifContractedSubBlock.gif    

        
return ; 
    }
 
    
if(num == 0
ExpandedSubBlockStart.gifContractedSubBlock.gif    

        store[num] 
= score; 
        Output(); 
        
return ; 
    }
 

    
for(int i = 0;i<=10;i++
ExpandedSubBlockStart.gifContractedSubBlock.gif    

        store[num] 
= i; 
        Cumput(score 
- i,num - 1); 
    }
 
}
 

int main() 
ExpandedBlockStart.gifContractedBlock.gif

    Cumput(
90,9); 
    cout
<<"总数:"<<sum<<endl; 
    
return 0
}


15.C++中空类默认产生那些类成员函数?

构造函数、析构函数、赋值函数、拷贝构造函数。

16.

#include<iostream>

using namespace std;

class A

ExpandedBlockStart.gifContractedBlock.gif
{

public:

       
void virtual f()

ExpandedSubBlockStart.gifContractedSubBlock.gif       
{

              cout
<<”A”<<endl;

       }


}
;

class B:public A

ExpandedBlockStart.gifContractedBlock.gif
{

public:

       
void virtual f()

ExpandedSubBlockStart.gifContractedSubBlock.gif       
{

              cout
<<”B”<<endl;

       }


}
;

int main()

ExpandedBlockStart.gifContractedBlock.gif
{

       A
* pa = new A();

       pa
->f();

       B
* pb = (B*)pa;

       pb
->f();

       delete pa,pb;

       pa 
= new B();

       pa
->f();

       pb 
= (B*)pa;

       pb
->f();

       
return 0;

}


程序输出A A B B

这是一个虚函数覆盖虚函数的问题。A类里的f函数是一个虚函数,虚函数是被子类同名函数所覆盖的。而B类里的f函数也是一个虚函数,它覆盖A类f函数的同时,也会被它的子类覆盖。但是在B* pb = (B*)pa;里面,该语句的意思是转化pa为B类型并新建一个指针pb,将pa复制到pb,但这里有一点请注意,就是pa的指针始终没有发生变化。所以pb也指向pa的f函数。这里并不存在覆盖的问题。

delete pa,pb;删除了pa和pb所指向的地址,但pa,pb指针并没有删除,也就是我们通常所说的悬浮指针。现在重新给pa指向新地址,所指向的位置是B类的,而pa指针类型是A类的,所以就产生了一个覆盖。pa->f();的值是B。

pb = (B*)pa;转化pa为B类指针给pb赋值,但pa所指向的f函数是B类的f函数,所以pb所指向的f函数是B类的f函数。pb->f();的值是B。

17.我们知道,大多数主流的语言或运行环境都支持3种最基本的内存分配方式,他们分别是:

静态分配:静态变量和全局变量的分配形式。我们可以把静态分配的内存看成是家里的耐用家具。通常,他们无需释放和回收,因为没有人会天天把大衣柜当做垃圾扔到窗外。

自动分配:在栈中为局部变量分配内存的方法,栈中的内存可以随着代码块退出时的出栈操作被自动释放。这类似于到家中串门的访客,天色一晚就要各自回各家,除了个别不识时务者以外,我们一般没必要把客人捆在垃圾袋里扫地出门。

动态分配:在堆中动态分配内存空间以存储数据的方式。堆中的内存块好像我们日常使用的餐巾纸,用过了就得扔到垃圾箱里,否则屋内就会满地狼藉。像我这样的懒人做梦都想有一台家用机器人跟在身边打扫卫生。在软件开发中,如果你懒得释放内存,那么你也需要一台类似的机器人——这其实就是一个有特定算法实现的垃圾收集器。

18.OSI七层模型

1>.物理层涉及到在信道上传输的原始比特流
2>.数据链路层的主要任务是加强物理层传输原始比特流的功能,使之对应的网络层显现为一条无错线路。发送包把输入数据封装在数据帧,按顺序传送出去并处理接受方回送的确认帧。
3>.网络层关系到子网的运行控制,其中一个关键问题是确认从源端到目的端如何选择路由。
4>.传输层的基本功能是从会话层接受数据而且把其分成较小的单元传递给网络层。
5>.会话层允许不同机器上的用户建立会话关系。
6>.表示层用来完成某些特定的功能。
7>.应用层包含着大量人们普遍需要的协议。

19.存储过程和函数的区别是什么?
存储过程是用户定义的一系列SQL语句的集合,涉及特定表或其他对象的任务,用户可以调用存储过程。而函数通常是数据库已定义的方法,它接受参数并返回某种类型的值,并且不涉及特定用户表。
游标的作用是什么?如何知道游标已经到了最后?
游标用于定位结果集的行。通过判断全局变量@@FETCH_STATUS可以判断其是否到了最后。通过此变量不等于0表示出错或到了最后。

20.多维数组和指针

char a[3][4]; 
char (*p)[4]; 
char *p1 
char **p2; 
= a; //正确 
p1 = *a; //正确 
p2 = a; //错误 

a是一个二维数组名,一个指向一维数组的指针
p是一个指向含有4个元素的一维数组的指针
p1是一个指向字符型变量的指针,*a相当于a[0],而a[0]是一个一维数组名,代表一维数组首元素的地址即&a[0][0],a[0][0]是一个字符型变量,所以正确
p2是一个指向字符型指针的指针

转载于:https://www.cnblogs.com/wanghao111/archive/2009/09/11/1564912.html

相关文章:

Codeforces.487C.Prefix Product Sequence(构造)

题目链接 \(Description\) 对于一个序列\(a_i\)&#xff0c;定义其前缀积序列为\(a_1\ \mathbb{mod}\ n,\ (a_1a_2)\ \mathbb{mod}\ n,...,(a_1a_2...a_n)\ \mathbb{mod}\ n\)。 给定\(n\)&#xff0c;求一个\(n\)的排列&#xff0c;使得该排列的前缀积序列是\([0,1,2,...,n-1]…

读取CSV文件内容,将其转换成JSON字符串输出

CsvToJsonUtil 工具类作用&#xff1a;读取CSV文件内容&#xff0c;将其转换成JSON字符串输出 转换工具类代码如下&#xff1a; package com.test.util;import java.io.*; import java.io.IOException;public class CsvToJsonUtil {/*** 根据文件路径读取CSV文件 返回String字…

component-scan和annotation-driven

<context:component-scan/>该xml配置作用是启动Spring的组件扫描功能&#xff0c;自动扫描base-package指定的包及其子文件下的java文件&#xff0c;如果扫描到有controller、Service、Repository、Component等注解的java类&#xff0c;就会将这些类注册为bean。指定的包…

“不亦乐乎”是“乐”还是“悦”?

看了六七年的《咬文嚼字》&#xff0c;在2009年的第一期第一次对其内容产生了巨大的质疑。这是《咬文嚼字》2009年第一期特稿&#xff1a;“《2008年十大语文差错》”&#xff0c;里面公布了《咬文嚼字》编辑部总结的2008年度十大语文差错&#xff1a;  一、“有朋自远方来&a…

mysql 数据操作 单表查询 where约束 between and or

WHERE约束 where字句中可以使用&#xff1a; 比较运算符&#xff1a;>< > < !between 80 and 100 值在80到100之间 >80 <100in(80,90,100) 值是80或90或100 满足这个条件就可以like egon%pattern可以是%或_&#xff0c;%表示任意多字符_表示一个字符…

查看计算机连接的WIFI密码

方法1&#xff1a;通过cmd命令获取 使用WinR组合键&#xff0c;打开命令提示符窗口&#xff0c;输入以下命令&#xff1a; netsh wlan show profiles WIFI名称 keyclear 或者 netsh wlan show profiles name"WIFI名称" keyclear 在输出的内容中&#xff0c;安全…

[VBScript] 自动删除2小时以前生成的文件

保存为deleteTempFiles.vbs&#xff0c;双击即可运行 dim folder, file, mFSO, subfolderSet mFSO CreateObject("Scripting.FileSystemObject") set foldermFSO.GetFolder("C:\Users\msautotestuser\AppData\Local\Temp") Delete files dim df For Each …

超市购物打印小票的简单程序 记录下来

做了2个版本的超市购物小票打印程序&#xff0c;做过记录一、C/S样图如下&#xff1a;其中 输入商品的编码 回车 将会调用该商品的信息&#xff0c;显示在下面的DataGridView中 ,DataGridView中数量是可以修改的&#xff0c;修改数量&#xff0c;下面的合计 将会自动计算 &…

Asp.net控件开发学习笔记(三)-控件开发基础

封装 在asp.net中&#xff0c;控件被分为两类.用户控件和自定义服务器控件。前者就是我们经常用来将一些可复用的内容封装成的.ascx文件。这里主要研究后者. 创建自定义服务器控件 创建自定义控件的第一步是选择以哪一个类作为基类来创建控件&#xff0c;Asp.net最常见的几个基…

Codeforces Round #447 (Div. 2) B. Ralph And His Magic Field 数学

题目链接 题意&#xff1a;给你三个数n,m,k;让你构造出一个nm的矩阵&#xff0c;矩阵元素只有两个值&#xff08;1&#xff0c;-1),且满足每行每列的乘积为k&#xff0c;问你多少个矩阵。 解法&#xff1a;首先&#xff0c;如果n&#xff0c;m奇偶不同&#xff0c;且k-1时&…

剑指offer三十六之两个链表的第一个公共结点

一、题目 输入两个链表&#xff0c;找出它们的第一个公共结点。 二、思路 如果存在共同节点的话&#xff0c;那么从该节点&#xff0c;两个链表之后的元素都是相同的。也就是说两个链表从尾部往前到某个点&#xff0c;节点都是一样的。我们可以用两个栈分别来装这两条链表。一个…

Oracle数据库相关命令

从cmd窗口进入SQL命令行 sqlplus / as sysdba; 查询所有用户 &#xff08;1&#xff09;使用具有DBA权限的账号登录数据库。 &#xff08;2&#xff09;执行如下命令。 SQL> select username from dba_users; -- 或者使用如下语句 SQL> select * from all_users; 创…

实时传输协议(RTP)

RTP简介 RTP是一种提供端对端传输服务的实时传输协议&#xff0c;用来支持在单目标广播和多目标广播网络服务中传输实时数据&#xff0c;而实时数据的传输则由RTCP协议来监视和控制。 RTP定义在RFC 使用RTP协议的应用程序运行在RTP之上&#xff0c;而执行RTP的程序运行在UDP…

Windows LTSC、LTSB、Server 安装 Windows Store 应用商店

下载安装包 打开网址 https://store.rg-adguard.net/ 以 PackageFamilyName 方式搜索 Microsoft.WindowsStore_8wekyb3d8bbwe 根据系统选择对应的包&#xff0c;每一种都要下载 安装 在下载目录按住 shift 键&#xff0c;然后鼠标右键&#xff0c;打开 Powershell 执行安装命令…

sybase Invalid command line argument 'and'.

解决方法&#xff1a; 先到sybase central安装目录下&#xff08;我这里是&#xff1a;C:\sybase\ASE-12_0\bin\syconfig.exe&#xff09;双击看能不能正常运行。如果可以&#xff0c;就证明是开始菜单里的“配置服务器”的快捷方式有问题&#xff1b; 然后删除开始菜单里面“配…

Jmeter调试工具---Debug Sampler

使用场景&#xff1a;脚本开发是&#xff0c;调试用&#xff08;正式测试时需删除&#xff09;&#xff0c;Debug Sampler会把我们自定义的变量输出在response data中 使用设置&#xff1a;JMeter properties和System properties通常都选false&#xff0c;这两个就是JMeter和系…

Cannot resolve method 'getParameter( )'

在JSP页面中&#xff0c;getParameter 和 setAttribute 显示红色&#xff0c;IDEA的提示信息为&#xff1a; Cannot resolve method getParameter(...) 和 Cannot resolve method setAttribute(...) 原因是缺少servlet-api.jar和jsp-api.jar这两个jar包。 将这两个jar包导入项…

产品设计体会(1011)少做就是多做

有100个需求&#xff0c;资源只够做10个&#xff0c;是的&#xff0c;当时就是这样。标题是马云的一句话。2007年国庆长假回来&#xff0c;基本在全力做网店版“批量定时上架”的需求&#xff0c;n多的pk、评审、确认会搞得头昏脑胀&#xff0c;不过终于算是把需求确认掉了。其…

socket与TcpListener/TcpClient/UdpClient 的区别及联系

点击此处下载源代码 应用程序可以通过 TCPClient、TCPListener 和 UDPClient 类使用传输控制协议 (TCP) 和用户数据文报协议 (UDP) 服务。这些协议类建立在 System.Net.Sockets.Socket 类的基础之上&#xff0c;负责数据传送的细节。(也就是说TCPClient、TCPListener 和 UDP…

Sql Server 中锁的概念

锁的类型:(1) 共享锁:共享锁用于所有的只读数据操作.(2) 修改锁:修改锁在修改操作的初始化阶段用来锁定可能要被修改的资源&#xff0c;这样可以避免使用共享锁造成的死锁现象(3) 独占锁:独占锁是为修改数据而保留的。它所锁定的资源&#xff0c;其他事务不能读取也不能修改。独…

Java的Clone

Clone 就是重写clone()方法 两种办法进行深拷贝&#xff0c;一种是Clonable接口&#xff0c;一种是Serializable接口 实现代码如下 package Clone;public class Student implements Cloneable {private String name;public String getName() {return name; }public void setNam…

MySQL登录时ERROR 1045:Access denied for user ‘root’@’localhost’ (using password: YES)

MySQL登录时ERROR 1045错误win10_x64系统中登录MySQL时出现1045错误 错误描述&#xff1a; ERROR 1045&#xff1a;Access denied for user ‘root’’localhost’ (using password: YES) 解决方法&#xff1a; 1、停止MySQL服务 方法&#xff1a;在DOS窗口使用net stop mysql…

对L2和B2的阐述

根据英特尔官方称&#xff0c;之所以把B2步进E6300改产成L2步进的原生2M的E6300&#xff0c;原因在于B2在生产上和高端6800属一类型的内制芯片&#xff0c;在针脚面都拥有7颗主晶体&#xff0c;是很容易让E6300超到很高&#xff0c;E6300面临着以后的中端市场不得不将其价格低下…

江西省移动物联网发展战略新闻发布会举行-2017年10月江西IDC排行榜与发展报告...

编者按&#xff1a;当人们在做技术创新时&#xff0c;我们在做“外包产业“&#xff1b;当人们在做制造产业&#xff0c;我们在做”服务产业“&#xff1b;江人们在做AI智能时&#xff0c;我们在做”物联网“崛起&#xff0c;即使有一个落差&#xff0c;但红色热土从不缺少成长…

获取Linux/Unix文件系统信息

设计一套SAP监控系统http://blog.csdn.net/bayaci/archive/2009/10/13/4666456.aspx显示系统df&#xff08;linux &#xff09;/ bdf (hpunix)的信息执行代码&#xff0c;获取诸如bdf /usr命令后的信息&#xff1a;DiskInfo diskInfo new DiskInfo();diskInfo.info(directory)…

MySQL数据库相关命令

MySQL数据库 1、MySQL导出命令 mysqldump -h IP -u 用户名 -p 数据库名 > 导出的文件名 注&#xff1a;mysqldump命令是在cmd窗口初始目录下的命令&#xff0c;不是进入mysql执行的命令。 或者使用如下命令 mysqldump -u 用户名 -p 数据库名称 > 导出的文件名 2、MyS…

docker(3)docker下的centos7下安装jdk

1、将jdk-8u65-linux-x64.tar.gz文件传到docker的宿主机上 rz 2、将宿主机上的jdk-8u65-linux-x64.tar.gz复制到centos7的容器下 #在宿主机上执行 [rootcent7-zuoys ~]# docker cp /root/jdk-8u65-linux-x64.tar.gz a3b489cec243:/software#a3b489cec243是指定的centos7容器id …

请问,关闭子窗口提示错误,大家遇到这样的问题吗?

请问,关闭子窗口提示错误,大家遇到这样的问题吗? Delphi / Windows SDK/APIhttp://www.delphi2007.net/DelphiBase/html/delphi_20061207133720244.html关闭子窗口时总是提示下面的错误: Access violation at address 00000008. Read of address 00000008 …

Hadoop学习笔记一 简要介绍

Hadoop学习笔记一 简要介绍 这里先大致介绍一下Hadoop. 本文大部分内容都是从官网Hadoop上来的。其中有一篇介绍HDFS的pdf文档&#xff0c;里面对Hadoop介绍的比较全面了。我的这一个系列的Hadoop学习笔记也是从这里一步一步进行下来的&#xff0c;同时又参考了网上的很多文…

Struts 2(八):文件上传

第一节 基于Struts 2完成文件上传 Struts 2框架中没有提供文件上传&#xff0c;而是通过Common-FileUpload框架或COS框架来实现的&#xff0c;Struts 2在原有上传框架的基础上进行了进一步封装&#xff0c;从而大大简化了文件上传的开发应用。 1.1 下载并安装Common-FileUpload…