C++中容易忽略的一些细节

(1)字符串函数strlen是如何用的。

strlen的原型为:

size_t strlen ( const char * str );

作用是返回C字符串的字符个数(不包含‘/0’), 使必须注意str是pointer to the null-terminated byte string to be examined。也就是说str指向的字符串必须以“\0”结尾, 否则出错的。

可能实现方式:

// strlen: return length of string strint strlen( const char* str ){int count;for ( count = 0; *str != ‘\0’; ++str )++count;return count;}

使用如下:

<span style="font-size:14px;">#include <iostream>#include <cstring>using namespace std;int main(){char m[] = "123"; // 4, 默认添加'/0', 表示字符串结束char n[5] = {'a', 'b', 'c'}; // 最后一个默认加'/0', 表示字符串结束cout << sizeof(m) << endl; //4cout << strlen(m) << endl; // 3cout << sizeof(n) << endl; //5cout << strlen(n) << endl; // 3return 0;}</span>运行结果如下:

再比如:

<span style="font-size:14px;">#include <iostream>#include <cstring>using namespace std;int main() {char n[] = {'a', 'b', 'c', '\0'}; // 最后一个不会默认加'/0', 表示字符串结束cout << sizeof(n) << endl; //5cout << strlen(n) << endl; // 3char m[] = {'a'};cout << sizeof(m) << endl; // 课件对于字符数组, 不会默认加'/0', 都需要手动加cout << strlen(m) << endl; // 任意数, 为4,因为没加\0return 0;}</span>注意, 对于字符数组来说, 它并不在乎中间或者末尾是否有没有’\0’结束字符, 因为数组知道他有多少个元素。 况且’\0’对她来说是一个合法的字符。 对于字符串库函数strlen, strcpy,等, 并不知道这个字符串是来自一个字符数组, 因为你传递进去的知识字符指针。 而字符指针(char* p)除了它的类型和值外, 不包含其他任何信息, 这些库函数总是假设你提供的字符指针指向的内存空间中的某个字节存放着一个’\0’, 它会很傻的知道找到这一个’\0’才肯罢休。 如果你能够保证通过字符数组下标访问数组中的每一个元素, 就没有必要在字符数组尾部加一个’\0’,, 但是大多数情况下我们无法保证, 因为大多数情况下, 总是吧字符数组用作字符串缓重区(例如 char buf[1024]), 所以应当在字符数组尾部放入这个麻烦的‘\0’.运行结果如下:

(2)使用数组的名字作为函数的参数, 数组名字退化成const的指针了。 此时取sizeof(), 总是返回4(指针存放的是地址)

如下例子:

<span style="font-size:14px;"><span style="font-size:14px;">#include <iostream>using namespace std;void func(int a[]) {    cout << sizeof(a) << endl; //为指针变量的大小4    cout << sizeof(a) / sizeof(a[0]) << endl;    cout << a[5] << endl;}int main() {    int a[4] = {1, 2, 3, 4};    func(a); // a退化成了一个指针变量    cout << sizeof(a) << endl;    cout << a[5] << endl; // 不会报错?!, 显示的是某个任意值    cout << sizeof(a) / sizeof(a[0]);    return 0;}</span></span>

运行结果为4

所以, 在函数内部, 必须传进数组大小的信息n。 无法通过sizeof求取元素的个数。 另外使用数组的的时候不要越界了。

(3)if 语句中如果进行float的值与0比较, 格式是什么

<span style="font-size:14px;">const float EPSILON = 1e-6;if((x >= -EPSILON) && (x <= EPSILON)) {//}</span>

(4)C++程序中调用C编译器编译过的函数, 为什么要加extern “C”

C++语言支持函数重载, 而C语言不支持函数重载。 函数被C++编译器编译和被C编译器编译后生成的内部名字是不一样的。

假如某个函数原型为:

<span style="font-size:14px;">void f(int x, int y);</span>该函数被C编译器编译后的内部名字为_foo, 而C++编译器则会生成像_foo_int_int之类的名字。 C++提供了C连接交换指定符号extern "C"来解决名字匹配问题(兼容)。世界会向那些有目标和远见的人让路(冯两努–香港着名推销商

C++中容易忽略的一些细节

相关文章:

你感兴趣的文章:

标签云: