面经 - C/C++ 基础篇

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 面经 - C/C++ 基础篇

1.下列C++代码的输出结果是什么?[台湾某著名杀毒软件公司2010年7月笔试题]

// Code 1inti=1;
intmain()
{
inti=i;
}
// Code 2intmain()
{
inti=i;
}
// Ps:Code1 和 Code2 是等价的。

A. The i within main will have an undefined value. (main() 里的 i 是一个未定义值)

B. The i within main will bave a value of 1. (main() 里的i值为1)

C. The compiler will not allow this statement. (编译器不允许这种写法)

D. The i within main will have a value of 0. (main() 里的i值为0)

解析:当面试者看到int i=i;时,也许第一反应就是怎么有这么诡异的代码?但是在C++中这样做是完全合法的(但显然不合理)。int i=i, i变量从声明的那一刻开始就是可见的了,main()里的i不是1,因为它和main()外的i无关,而是一个未定义值。


2.以下代码的输出结果是什么?[中国著名通信企业H公司2007年7月面试题]

#include<bits/stdc++.h>usingnamespacestd;
intmain()
{
inta[]={6,7,8,9,10};
int*p=a;
*(p++)+=123;
printf("%d,%d\n",*p,*(++p));
return0;
}

A. 88    B. 1308    C. 77    D. 78

解析:

a、*(p++)+=123应为*p=*p+123;p++,此时 p 应指向第二个元素7。

b、printf( "%d,%d\n ",*p,*(++p)); 从右到左运算,第一个是(++p),也就是p++,*p=8,此时p指向第三个元素8,所以全部为8。


3.下面两段程序有两种写法,你青睐哪种,为什么?[美国某著名计算机嵌入式公司2005年10月面试题]

// 写法1:for(i=0;i<8;i++) {X=i+Y+J*7;printf("%d",x);}
// 写法2:S=Y+J*7;for(i=0;i<8;i++) {printf("%d",i+S);}

解析:第二种写法好一些,将部分加法运算放到了循环体外,提高了效率。缺点是程序不够简洁。


4.下面程序的结果是多少?[中国著名通信企业S公司2007年8月面试题]

#include <iostream>usingnamespacestd;
intmain()
{
floata=1.0f;
cout<< (int)a<<endl;
cout<<&a<<endl;
cout<< (int&)a<<endl;
cout<<boolalpha<< ( (int)a== (int&)a ) <<endl; //输出什么?floatb=0.0f;
cout<< (int)b<<endl;
cout<<&b<<endl;
cout<< (int&)b<<endl;
cout<<boolalpha<< ( (int)b== (int&)b ) <<endl; //输出什么?return0;
}

答案:false true 或者 0 1。

解析:在机器上运行一下,可以得到结果,“cout << (int&)a << endl;”输出的是1065353216,而不是1。这是因为浮点数在内存里和整数的存储方式不同,(int&)a相当于将该浮点数地址开始的sizeof(int)个字节当成int型的数据输出,因此这取决于float型数据在内存中的存储方式,而不是经过(int&)a显示转换的结果(1)。

因为float a = 1.0f在内存中的表示都是3f800000,而浮点数和一般整型不一样,所以当(int&)a强制转换时,会把内存值3f8000000当做int型输出,所以结果自然变为了1065353216(0x3f800000的十进制表示)。

i、(int)x 强制类型转换,是将浮点数x为参数构造整数(即float转换为int)。

ii、(int &)y 则是告诉编译器将y看成int对待(内存里的数据不做任何转换),所以(int &)x值为1071 644 672。

iii、浮点数0.0是比较特殊的,它并不按照上面说的浮点数的格式存储,浮点数0.0在内存里的存储是000.....000(全零)。


5.下面程序的结果是多少?[中国著名通信企业S公司2007年8月面试题]

#include <stdio.h>intmain()
{
unsignedinta=0xFFFFFFF7;
unsignedchari= (unsignedchar)a;
char*b= (char*)&a;
printf("%08x, %08x", i,*b);
return0;
}

答案:000000f7,fffffff7。

解析:unsigned int变量赋值给unsigned char变量时会发生字节截断(unsigned int:4字节;unsigned char:1字节)。 那么第二个数,也就是char* b = (char*)&a中a本身为一个uint(unsigned int)类型的值,把它的地址赋给一个执行char类型数据的指针。char类型的长度只有一个字节,打印char类型的指针指向的值会是多少? &a的结果是一个指针,它的类型取决于a的类型,此处&a的类型应该是:

unsigned int *;
char *b = (char *)&a;

上面等价于:

unsigned int *p = &a; // p中的内容是a的地址,即p指向a

char *b = (char *)p;  // 此处的强制转换只是使b也指向a而已

上面的步骤就是将一个unsigned int型的指针强制转换成一个char型的指针。所以请注意:这里是char类型的指针转换,而不是char类型的转换。 这样转换后,假设a的地址是x:

p + 1 = x + 1*sizeof(int) = x + 1 * 4 = x + 4;        

b + 1 = x + 1*sizeof(char) = x + 1 * 1 = x + 1;

影响的是指针的寻址。


6.运算符优先级题

intx=4,y=7;
y=y+++x-3;
System.out.format("%d,%d\n", x,y);
Console:4,8

7.待更新...

目录
相关文章
|
Linux C++
嵌入式linux基础:c++(五)构造函数
嵌入式linux基础:c++(五)构造函数
160 0
嵌入式linux基础:c++(五)构造函数
|
Linux 编译器 C++
嵌入式linux基础:c++(四)重载 指针 引用
嵌入式linux基础:c++(四)重载 指针 引用
145 0
嵌入式linux基础:c++(四)重载 指针 引用
|
Linux C++
嵌入式linux基础:c++(三)程序结构
嵌入式linux基础:c++(三)程序结构
163 0
嵌入式linux基础:c++(三)程序结构
|
编译器 调度 C++
C++从入门到精通(第四篇) :C++的基础和灵魂:类和对象(下篇)
在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值
117 0
C++从入门到精通(第四篇) :C++的基础和灵魂:类和对象(下篇)
|
存储 编译器 C语言
C++从入门到精通(第二篇) :C++的基础和灵魂:类和对象(上篇)
C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。 C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。
137 0
C++从入门到精通(第二篇) :C++的基础和灵魂:类和对象(上篇)
|
存储 编译器 C语言
C++从入门到精通(第三篇) :C++的基础和灵魂:类和对象(中篇)
如果一个类中什么成员都没有,简称为空类。空类中什么都没有吗?并不是的,任何一个类在我们不写的情 况下,都会自动生成下面6个默认成员函数。
119 0
C++从入门到精通(第三篇) :C++的基础和灵魂:类和对象(中篇)
|
设计模式 测试技术 uml
[学习][笔记]设计模式(基于C/C++实现)之 设计基础
设计模式(基于C/C++实现)之 设计基础
380 0
[学习][笔记]设计模式(基于C/C++实现)之 设计基础
|
C++
【牛客刷题】带你在牛客刷题第六弹(C/C++基础)
哈喽,今天是我们牛客刷题训练第五弹,今天我们来刷一些C/C++的问题,这些问题相对于你刚学习C/C++基础来说会很好的帮助自己理解,我相信,只要我们一步步去分析,肯定是可以得到正确的答案的,来我们一起加油。
110 0
【牛客刷题】带你在牛客刷题第六弹(C/C++基础)
|
安全 编译器 Linux