1.关于scanf()与printf()的返回值问题
int x = scanf("%d %c", &a,&b);
x表示正确输入的变量的个数。但是如果第一个变量输入出了错误,那么编译器就按后面全错
返回x等于0;只有第一个正确输入以后才能正确的计算出正确输入变量的数量;
int y =printf("%d %c", a,b);
y表示输出的字符串长度,主要是"*******"里面的那一部分(*******)字符串!!
2.关于5个调用约定
(1)__stdcall
(2)__cdecl
(3)__fastcall
(4)__thiscall
(5)__naked call
3.文件的编译过程
**.cpp->**.i->汇编->**.obj->*.exe
4.查询一下esp、ebp、eip、push、pop、call、ret的具体意思
5.编译器在编译代码的时候有两种编译方式:
(1)win32 Debug: a)支持用断点调试
(2)win32 Release: a)不支持用断点调试
Debug比Release里面多了很多调试信息,所以前者比后者大,比如说assert在 Release版本 就不起作用,DEBUG就是用于调试的,而Release 是用于发行的.
Debug 的 Runtime Library 加强了对错误的检测,如堆内存分配,有时会出现 Debug 有错但 Release 正常的现象,
补充:只有DEBUG版的程序才能设置断点、单步执行、使用TRACE/ASSERT等调试输出语句。REALEASE不包含任何调试信息,所以体积小、运行速度快。
用两种编译方式编译以下代码:
int main()
{
int i = 0;
printf("%d %d %d \n", ++i, i++, ++i);
printf("%d\n", i);
return 0;
}
分别写出输出的结果。
6.关于c++的输入cin>>a>>b的问题(有待查询学习)
int main()
{
int a;
char ch;
cin>>a>>ch;
return 0;
}
7.只有负数在扩充的时候才扩充1,其它的情况只扩充0;
int main()
{
int a=b;
char ch=100;--->(实际上在内存中是怎么样保存的,要把它写成二进制的,根据规则翻
译,就像计算机一样,不要转变成十进制计算。这是关键)
a=ch;------>(要扩充)
ch =a;------>(要截取)
return 0;
}
char a=500---->(二进制是多少?) 1 1111 0100
8.float ft=12.25;
int* ip =&ft;---->(此时编译会出错,要变成int* ip =(int*)&ft,)
体会:
指针对内存的解读根据其类型,但是“=”两边的类型实现相同后再能再谈这些,这
样编译才能通过。
9.写出 c
10.#define:
(1)没有类型的检查。
(2)没有内存的分配。
11.const a 在c++中用覆盖的方式在编译的时候直接替换,相当于#define的效果,他是直
接替换,不再从变量a中取值,这样就是一种优化,有利于提高效率!这个也是const在c++比在c中扩展出来的东西之一!
12.问题:
(1)怎么确定测试编译器到底是用c还是用c++的编译方式编译源代码的?-->作业!!!!!
用bool检测(c++不包括bool)
int x = scanf("%d %c", &a,&b);
x表示正确输入的变量的个数。但是如果第一个变量输入出了错误,那么编译器就按后面全错
返回x等于0;只有第一个正确输入以后才能正确的计算出正确输入变量的数量;
int y =printf("%d %c", a,b);
y表示输出的字符串长度,主要是"*******"里面的那一部分(*******)字符串!!
2.关于5个调用约定
(1)__stdcall
(2)__cdecl
(3)__fastcall
(4)__thiscall
(5)__naked call
3.文件的编译过程
**.cpp->**.i->汇编->**.obj->*.exe
4.查询一下esp、ebp、eip、push、pop、call、ret的具体意思
5.编译器在编译代码的时候有两种编译方式:
(1)win32 Debug: a)支持用断点调试
(2)win32 Release: a)不支持用断点调试
Debug比Release里面多了很多调试信息,所以前者比后者大,比如说assert在 Release版本 就不起作用,DEBUG就是用于调试的,而Release 是用于发行的.
Debug 的 Runtime Library 加强了对错误的检测,如堆内存分配,有时会出现 Debug 有错但 Release 正常的现象,
补充:只有DEBUG版的程序才能设置断点、单步执行、使用TRACE/ASSERT等调试输出语句。REALEASE不包含任何调试信息,所以体积小、运行速度快。
用两种编译方式编译以下代码:
int main()
{
int i = 0;
printf("%d %d %d \n", ++i, i++, ++i);
printf("%d\n", i);
return 0;
}
分别写出输出的结果。
6.关于c++的输入cin>>a>>b的问题(有待查询学习)
int main()
{
int a;
char ch;
cin>>a>>ch;
return 0;
}
7.只有负数在扩充的时候才扩充1,其它的情况只扩充0;
int main()
{
int a=b;
char ch=100;--->(实际上在内存中是怎么样保存的,要把它写成二进制的,根据规则翻
译,就像计算机一样,不要转变成十进制计算。这是关键)
a=ch;------>(要扩充)
ch =a;------>(要截取)
return 0;
}
char a=500---->(二进制是多少?) 1 1111 0100
8.float ft=12.25;
int* ip =&ft;---->(此时编译会出错,要变成int* ip =(int*)&ft,)
体会:
指针对内存的解读根据其类型,但是“=”两边的类型实现相同后再能再谈这些,这
样编译才能通过。
9.写出 c
10.#define:
(1)没有类型的检查。
(2)没有内存的分配。
11.const a 在c++中用覆盖的方式在编译的时候直接替换,相当于#define的效果,他是直
接替换,不再从变量a中取值,这样就是一种优化,有利于提高效率!这个也是const在c++比在c中扩展出来的东西之一!
12.问题:
(1)怎么确定测试编译器到底是用c还是用c++的编译方式编译源代码的?-->作业!!!!!
用bool检测(c++不包括bool)