1、字符数组是以\0为结束标志
char ca[100] = "Good\0Day!";
如果cout<<ca<<endl,那么结果为Good,并不会输出Day;
那么Day存在数组ca中吗?存在的ca[5]就是D,ca[6]就是a,ca[7]就是y.
2、假设输出cout<<"good" + 1<<endl;结果为ood
输出cout<<"good" + 2<<endl;结果为od
相当于指针问题
3、\r是回车符,是回到本行的最左边
cout<<"good\rxy"<<endl;
结果输出:xyod
4、unsigned int i =-1;
无符号数-1,也就是整数最大值
5、 cout<<sizeof(bool)<<endl; //1
cout<<sizeof(char)<<endl; //1
cout<<sizeof(unsigned char)<<endl; //1
cout<<sizeof(short)<<endl; //2
cout<<sizeof(unsigned short)<<endl; //2
cout<<sizeof(int)<<endl; //4
cout<<sizeof(unsigned int)<<endl; //4
cout<<sizeof(long)<<endl; //4
cout<<sizeof(unsigned long)<<endl; //4
cout<<sizeof(float)<<endl; //4
cout<<sizeof(double)<<endl; //8
cout<<sizeof(long double)<<endl; //8
6、变量类型终身不变
7、移位运算符
<<左移,所有进制位依次向左移,左边的丢失,右边补0
int i = 2;
i=i<<2;
cout<<i<<endl;
那么输出结果为8.
>>右移,所有进制位依次向右移,右边的丢失,左边补0
无符号数补0,
有符号数 | 非负数 补0
| 负数 补1
int i = -1;
cout<<(i>>5)<<endl;
结果为1
int i = 64;
cout<<(i>>2)<<endl;
结果为16
8、int i = 100;
1<i<2为真还是假,结果为真,因为1<i,结果为真,那么表达式值为1
然后1<2为真,那么结果为真
9、异或运算^
1^1 = 0;
1^2 = 3;
(a^b)^b = a;
(a^b)^a = b;
10、经典判断
int k = 10;
if(k=!2){k=!2结果为0,也就是假,因为!2为0,在赋值给k
}
11、不确定的值
int a = 10;
int b = (a = 5) + (++a);
cout<<b<<endl;
不同编译器不一样
12、switch语句比if else效率高,它会直接跳转到适当的位置。
数值是能比较的整型。
可以类型为整型,字符,枚举
13、int main()函数中return 0;可写可不写,不写默认会加上return 0;
而其他函数则不会
14、int f(int x = 1){
cout<<x<<endl;
return 0;
}
如果定义函数时,参数有值,那么就调用时,可以不传参数
例如:
int a = f();//这样就可以了
15、进行函数重载
int f(int x=1){
cout<<x<<endl;
return 0;
}
int f(){
cout<<"xxxxxs"<<endl;
return 0;
}
这样写法是错误的,要进行函数重载,f(int x=1);不要带默认参数,否则编译器解释不清楚。
因为f(int x=1),也可以int a = f();这样调用
16、cout<<sizeof(int [5])<<endl;
结果输出20
17、int a[5];
数组名表示第一个元素的地址
cout<<a<<endl;
cout<<&a[0]<<endl;
结果是一样的
为了兼容C,C++用cout输出字符变量和字符数组中元素的地址时,
改成输出从这个内存单元开始存放的一系列字符,到向后遇到第
一个'\0'为止。
例如:
char a = 'A';
cout<<&a<<endl;结果是未知的
只有使用printf("%d",&a);才是输出字符a地址的值
只有字符变量会出现这样的情况。
18、数组越界问题
#include <iostream>
using namespace std;
void main(){
int x = 10;
int y = 20;
int z = 30;
int a[5];
int k = 40;
a[5] = 100;
a[6] = 200;
a[7] = 300;
a[-1] = 400;
cout<<"x="<<x<<endl;
cout<<"y="<<y<<endl;
cout<<"z="<<z<<endl;
cout<<"k="<<k<<endl;
}
x,y,z的结果会出现问题,可能已经不是原来的10,20了,可能为300,200,100;
也有可能不是,因为数组开辟空间时是要求连续的地址。
main()函数的压栈情况为:
a[0],a[1],a[2],a[3],a[4],z,y,x;
所以如果操作a[5]有可能就会改变z,操作a[6]有可能就会改变y,操作a[7]有可能就会改变x;
如果数组开辟的连续空间与z,y,x不在一起,那么不会改变。
数组的负下标也会越界,要注意。
19、费解的问题
#include <iostream>
using namespace std;
double score(double a[]){
cout<<"sizeof(a) = "<<sizeof(a)<<endl;
return 100.0;
}
int main(){
double b[5]={1,2,3,4,5};
cout<<"sizeof(b) = "<<sizeof(b)<<endl;
cout<<"score = "<<score(b)<<endl;
return 0;
}
这里输出结果:
sizeof(b) = 40
sizeof(a) = 4
score = 100
原因是这样的:把数组名当数值用的时候它仅仅是一个地址,而一个地址用4个字节保存,
所以结果为4。
sizeof(类型),因为第一次sizeof(b),b是double [5],所以结果为40
而score(b),传递的是数组的地址,所以在score()函数内部sizeof(a),结果为4
20、
#include <iostream>
using namespace std;
struct Student{
int sno;
char name[7];
};
int main(){
Student s1 = {100,"谭惟午"};
Student s2;
//s2 = {100,"谭惟午"};//这样写会出错
s2.sno = 200;
strcpy(s2.name,"马曼曼");
//给字符数组赋值使用strcpy来操作
cout<<s1.sno<<","<<s1.name<<endl;
cout<<s2.sno<<","<<s2.name<<endl;
return 0;
}
21、结构体大小问题:
#include <iostream>
using namespace std;
struct Student{
char name[20];
bool gender;
int age;
char addr[120];
double score;
};
int main(){
Student s1;
cout<<"sizeof(Student)="<<sizeof(Student)<<endl;
//结果是160,这是为什么呢?
//输出每个变量的地址,就可以知道内存分配问题
cout<<"&s1="<<&s1<<endl;
cout<<"&s1.name="<<&s1.name<<endl;
cout<<"&s1.gender="<<&s1.gender<<endl;
cout<<"&s1.age="<<&s1.age<<endl;
cout<<"&s1.addr="<<&s1.addr<<endl;
//这里addr定义大小为120,但实际上分配了124
cout<<"&s1.score="<<&s1.score<<endl;
return 0;
}
分享到:
相关推荐
总结C++中多线程要注意的事项,不能跨线程调用MFC对象等等
学习C++时,需要注意一些关键点,以避免误解和陷阱。以下是对标题和描述中提到的15个问题的详细解释: 1. C++与C的关系:C++是从C发展而来的,但并非C的替代或升级。两者是并行的语言,各有其独立的标准,例如C++98...
通过以上步骤,我们可以使用C++实现一个高效的最优装载问题求解器,以解决实际问题中的装载优化挑战。在编写代码时,需要注意数据结构的选择(如使用vector或数组)、内存管理以及效率优化等方面,以确保程序的正确...
百鸡问题是经典的数学问题,它...通过这个百鸡问题的C++实现,我们可以学习到如何将数学问题转化为编程问题,以及如何利用循环和条件判断来解决实际问题。这不仅锻炼了我们的逻辑思维能力,也加深了对C++语言的理解。
不要忽视看似简单的编程问题,它们可能隐藏着复杂的概念或技巧。例如,class、template、STL和generic programming是C++的高级特性,需要通过实践和不断学习才能熟练掌握。 在学习过程中,避免浮躁的心态至关重要。...
以上是对“用C++编写邮局选址问题”代码的分析及其中涉及到的一些C++知识点。邮局选址问题是一个典型的优化问题,通过理解并运用C++的基础知识和算法可以有效地解决这类问题。希望本文能够帮助您更好地理解和掌握C++...
总之,"旅行商问题求解(C++)"这个项目展示了如何利用C++编程语言和OpenCV库解决一个经典的组合优化问题,提供了一个将理论知识与实践相结合的实例,对于学习和理解运筹学、算法和计算机图形学都有积极的促进作用。
下面将详细讨论一些常见的问题及其解决方案。 1. **内存管理**:C++允许直接控制内存,这可能导致内存泄漏或悬挂指针。理解何时使用`new`和`delete`至关重要,确保每次分配的内存都被正确释放。同时,掌握智能指针...
10. **设计模式(Design Patterns)**:《Exceptional C++》可能结合实际问题讲解一些经典的设计模式,如工厂模式、单例模式、观察者模式等,以增强代码的可复用性和灵活性。 通过对这些问题的解答和讨论,读者不仅...
《约瑟夫问题的C++实现与数据结构解析》 约瑟夫问题,又称为约瑟夫环,是一个著名的理论问题,源自古罗马历史故事。该问题的基本设定是:人们围成一个圈,从某个人开始按顺时针方向依次报数,数到特定数值的人出圈...
c++注意点小组讨论,这是我们实验室的师兄师姐们在我刚上研究生时给出的VC++编成注意点!
下面我们将深入探讨一些C++编程中值得注意的知识点。 1. **内存管理**:C++提供了动态内存分配(new和delete)和栈内存管理。理解如何正确使用指针,避免内存泄漏和悬挂指针至关重要。此外,学习智能指针(如unique...
在C++实现KWIC时,还需要注意以下关键点: - **字符串处理**:C++的`std::string`类是处理字符串的基础,需要熟练使用`substr`、`find`等方法来提取单词和上下文。 - **输入输出**:C++的`std::ifstream`用于读取...
6. **错误处理**:如果编译时出现错误,DevC++会在输出窗口显示错误信息,帮助你定位问题。理解并修复这些错误是编程学习的重要部分。 7. **调试功能**:DevC++提供了调试工具,如断点、单步执行、查看变量值等。在...
8. **内存管理**:C++支持动态内存分配,程序员可以直接使用new和delete操作符进行内存管理,这虽然灵活但也要求程序员注意内存泄漏问题。C++11引入了智能指针(shared_ptr、unique_ptr等),自动管理内存,减少了...
在准备C++相关的面试时,理解并掌握C++的基础概念、语法特性、内存管理、面向对象编程、模板、STL库、异常处理等核心知识点至关重要。以下是对这些关键领域的详细阐述: 1. **C++基础**:理解C++的基础语法,如变量...
6. **代码实现**:编写C++代码时,注意清晰地定义函数接口,使用适当的数据结构,并在适当的地方添加注释,以便理解和维护。同时,考虑到C++的内存管理和效率,选择合适的数据结构和算法是非常关键的。 7. **测试与...
我们所给的是c++课程,里面包含很多知识点,以及在C++使用或者编程时应该注意的问题。
内存泄漏是C++程序中常见的问题,当分配的内存未被正确释放时,这部分内存将无法被再次使用,久而久之可能导致系统资源耗尽。检测和修复内存泄漏通常需要借助工具或仔细的代码审查。 4. 内存回收: C++不提供自动...