C语言一句话知识

 

1.   class和struct的区别

class和struct的用法没什么区别,只是class默认的成员变量是private,而struct默认是public。

2.   printf打印一个string时不要忘记使用%s

看代码便知:

int main()

{

    char string[] = “Hello c programmers %dd”;

    printf(string);

    return 0;

}

3.   inline的好处

在实时系统中,最重要的事代码的运行速度。所以你可以采用inline关键字来减少调用一个函数并返回它的时间。例如:

inline double cube(double x)

{

    return x * x * x;

}

4.   gets是危险的

char string[100];

printf(“ENTER SENTENCE: ”);

gets(string);

这段代码很危险,有可能数组溢出。请使用fgets代替。fgets有两个参数可以控制。

5.   c++中定义抽象类

一个类想编程抽象类,它的成员函数加virtual并没有主体(=0),这样的类不能实例化,只能被继承。

6.   拷贝构造函数

class CopiableClass

{

public:

    CopiableClass (const CopiableClass& other);   // 拷贝构造函数

};

拷贝构造函数应该拷贝类及其父类中所有的数据。如果你的类有指针,那就需要分配空间,假如指针是多态类型,那就应该使用多态复制方法。

7.   C++中纯抽象基类就是一个合同

C++中纯抽象基类就像是实现类和用户之间的一个合同,具体怎么实现由实现类来决定。

class Contract

{

    virtual short foo(void) = 0;

}

class A : public class Contract

{

    short foo(void) { return 2; }

}

class B : public class Contract

{

    short foo(void) { return 4; }

}

 

int main(int argc, char *argv[])

{

    Contract *pContract = new B;

    std::cout << “foo=” << pContract->foo() << std::endl;

    delete pContract;

    return 0;

}

8.   float和double的区别

float a = 3.14f;

if (a == 3.14)

{

    cout << “hello” << endl;

}

else

{

    cout << “bye” << endl;

}

输出肯定是bye。因为系统默认是double。

9.   无临时变量的swap函数

void swap(int& a, int& b)

{

    a ^= b;

    b ^= a;

    a ^= b;

}

为了保证两个变量不重叠,改为以下:

void swap(int& __restrict a, int& __restrict b)

{

    assert(&a != &b);

    a ^= b;

    b ^= a;

    a ^= b;

}

10. 无临时变量的swap函数

int a,b;

scanf("%d %d",&a,&b);

b=(a+b)-(a=b);

printf("%d %d",a,b);

11. 除法的逻辑错误

float ans = 5 / 10;  // ans的数值是0,而不是0.5

12. 类型比较的问题

unsigned int u = 10;

for(int i = -1; i <= u; i++)    { /*一次也不执行*/ }

13. assert()自己

#include <cassert>或者#include <assert.h>

assert(thePtrThatShouldNeverBeNull != NULL);

不想比较了,#define NDEBUG,所有的assert全部失效。

14. 在循环判断中不要用上strlen

for (int ix = 0; ix < strlen(a_str); ix++)

{

    a_str[ix] = tolower((unsigned char) a_str[ix]);

}

每次循环都计算一遍,要优化。

15. int *p的定义

int* p, q是一个指针一个变量。

Int *p, *q是两个指针。

16. 优化:用乘法代替除法

乘法速度比除法速度快多了。

17. 优化:++a和a++

for(x = 0; x < 10; x++) 不如 for(x = 0; x < 10; ++x)速度快。

for(g = g_list.begin(); g != g_list.end(); ++g) 比 for(g = g_list.begin(); g != g_list.end(); g++) 快。

18. 不要在sizeof前面加正负号

cout << -sizeof(char);   // 结果是4294967295

因为sizeof的返回值是unsigned int。

19. 数字转换为string

C语言:

#include <math.h>

#include <stdio.h>

char* itoa(int num)

{

    int size = log10(num) + 1;

    char *x = malloc(size);

    snprintf(x, size, “%d”, num);

}

C++语言:

#include <iostream>

#include <sstream>

#include <string>

string itoa(int num)

{

    Stringstream converter;

    Converter << num;

    return converter.str();

}

20. free和delete完之后要执行pointer = NULL

21. 优化:用<<来优化

a *= 100;

a = (a << 6) + (a << 5) + (a << 2);

22. 不要使用void main()

23. cin之后要清理

#include <iostream>

int main(int argc, char* argv[])

{

int age;

std::cout << "Enter your age: ";

std::cin >> age;

std::cin.ignore();   // 这句很关键

std::cout << "You entered " << age << std::endl;

    std::cin.get();

}

24. strcpy不安全,尽量用strncpy

25. 优化:采用a++,a--替代a+=1,a-=1

26. gets有可能溢出,用fgets替代

27. 用STL的容器来替代c数组

28. #include <stdlib.h> system函数执行系统命令

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值