posts - 3,  comments - 0,  trackbacks - 0
100

1、变量的作用域。
没想到,可以直接使用::vac++;来引用全局变量。
#include <iostream>
using namespace std;
int Vac=3;
int main()
{
    int Vac=10;
    ::Vac++;   // 如果没有定义局部变量Vac,也是可以直接引用全局变量的。但是这里通过Vac只能引用到局部变量,要想引用全局变量,只能使用::Vac, 这些解读,都是由编译器来完成的吧...   两个作用域不同的变量,虽然变量名相同,但并不是同一个变量
    cout << ::Vac << endl;
    cout << Vac << endl;
    return 0;
}
输出时4 10

2、事后计算(或者说先返回值,之后的自增才生效?)
int i=1,j=2;
k = i+++j;
k的值是3,之后i的值是2.

3、连乘
#include <iostream>
using namespace std;

int main()
{
 int i = 3;
 cout << i++*i++ << endl;  // 开始把输出结果写成12了,第一个返回3,加法在之后生效,所以返回4,3*4=12,其实错了,由于两个优先级相同,都是先返回3,乘法运算使用的是3*3,之后自增运算才生效?
 cout << i << endl;  //输出的结果是5


4、编程风格。
if('A'==a) {
    a++;
} // 这种编程风格要好些。避免了把"=="误写为"=",因为编译器不允许对常量赋值,就可以检查到错误

if(a=='A') {
    a++;
}

5、类型转换,原来unsigned int在 int之上。
-20从int转换为 unsigned int,值为11111111 11111111 11111111 11101100, 这里最后的数字不能搞错。全1实际上对应的值是-1,-20 = -1 -19,可以通过补码计算得到。。。
unsigned int a = 6;
int b = -20;
char c;
(a+b>6)?c=1:c=0;
最后c的值是1,无符号数对于嵌入式系统更为重要。即使是猜,可以得出c=1,详细分析过程不出错,则要要有清晰理解

6、C++程序中,调用C编译器编译后的函数,为什么要加extern "C"
extern "C" {} 是告诉编译器,括号里面的代码需要按照C的格式进行编译,连接时要按C得命名规则去找
C++支持函数重载,C语言不支持函数重载。函数被C++编译器编译后在库中的名字与C语言的不同。假设某个函数的原型为:void foo(int x, int y)。该函数被C编译器编译后在库中的名字为_foo(),而C++编译器则会产生_foo_int_int之类的名称。
C++提供了C连接交换指定符号 extern "C" 解决名字的匹配问题
由于C++支持重载,仅仅靠函数名还是不能确定函数的,还要根据参数列表

7、判定是C++编译器还是C编译器。
通过宏, __cplusplus和_STDC_

8、new和malloc的区别。 2008-8-26 提问过,呵呵
C++中new和malloc,C中只有malloc。两者申请到的内存都在堆上。new申请到的内存要用delete释放,malloc申请的内存则要用free进行释放。
new是C++所特有的,为什么一定要有new呢?  每样语言机制的设计,都是有其存在理由的,当申请到一块内存,并需要做初始化时,new就发挥作用了,它可以调用构造函数的。 而这是C语言所不具备的特性。

9、int const& max(int const& a, int const& b) 和int max(int a, int b) 有什么区别啊? 2008-07-30 20:33:44提问过
前者的效率会高一些,特别当传入的参数,或者返回的参数是比较大的对象时。因为后者会拷贝复制临时变量。
中间提及了引用和指针的区别。
引用必须在定义时候初始化,引用一旦初始化就不能改变引用的对象


10、无临时变量参数调换
用^异或操作更佳,如果两个数据较大,不会发生溢出

11、内存泄露问题
下面代码直接退出会造成内存泄露吗?
struct A {
     char* name;
}

main()
{
    struct A test;
    test.name = "name1";                                                 // C的内存管理和C++是不同的,但是如果使用C++编译器,则使用相同的机制? 其实各个编译器,具体可能也有区别的
    struct A *test2 = (struct A*)malloc(sizeof(struct a));   // malloc分配的应该是堆上的空间吧,必须free掉吗?
    test2.name = "name2";
}
091027 栈上是一定会释放掉的。

12、i++, ++i哪个性能高
++i  这个题目应该用滥了吧,ali研究院也在用,呵呵

13、生成临时对象的几种方式。
a、赋值 b、类型转换      其他的呢?

14、 A a, b, c;  a=b=c;  会有问题吗?             // 其实这些是考虑对语言拐弯抹角处的掌握。。。
b=c如果返回类型不是A,会报错?  X     有可能也是错的,因为从其他类型自动转换成A类型还是有可能的
b=c类型不是A,有可能会报错。因为没法转换成A类型。

posted on 2009-09-05 16:58 thinke365 阅读(157) 评论(0)  编辑 收藏 引用 所属分类: note

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理