精华内容
下载资源
问答
  • VC的调试文档,不会的快看看吧
    2021-05-24 03:55:19

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

    例子:

    char* strcpy(char*

    dest,char* source)

    {

    assert(source!=0);

    assert(dest!=0);

    char* returnstring

    = dest;

    while((*dest++ =

    *source++)!= ‘\0’)

    {

    ;

    }

    return

    returnstring;

    }

    2、防御性的编程

    例子: char* strcpy(char* dest,char* source)

    {

    if(source == 0)

    {

    assert(false);

    reutrn 0;

    }

    if(dest == 0)

    {

    assert(false);

    return 0;

    }

    char* returnstring

    = dest;

    while((*dest++ =

    *source++)!= ‘\0’)

    {

    ;

    }

    return

    returnstring;

    }

    3、使用Trace

    以下的例子只能在debug中显示,

    例子:

    a)、TRACECString csTest = “test”;

    TRACE(“CString is %s\n”,csTest);

    b)、ATLTRACE

    c)、afxDump

    CTime time =

    CTime::GetCurrentTime();

    #ifdef _DEBUG

    afxDump <<

    time << “\n”;

    #endif

    4、用GetLastError来检测返回值,通过得到错误代码来分析错误原因

    5、把错误信息记录到文件中

    异常处理

    程序设计时一定要考虑到异常如何处理,当错误发生后,不应简单的报告错误并退出程序,应当尽可能的想办法恢复到出错前的状态或者让程序从头开始运行,并且对于某些错误,应该能够容错,即允许错误的存在,但是程序还是能够正常完成任务。

    调试技巧

    1、VC++中F5进行调试运行

    a)、在output Debug窗口中可以看到用TRACE打印的信息

    b)、 Call Stack窗口中能看到程序的调用堆栈

    2、当Debug版本运行时发生崩溃,选择retry进行调试,通过看Call

    Stack分析出错的位置及原因

    3、使用映射文件调试

    a)、创建映射文件:Project settings中link项,选中Generate mapfile,输出程序代码地址:/MAPINFO:

    LINES,得到引出序号:/MAPINFO: EXPORTS。

    b)、程序发布时,应该把所有模块的映射文件都存档。

    c)、查看映射文件:见” 通过崩溃地址找出源代码的出错行”文件。

    4、可以调试的Release版本

    Project settings中C++项的Debug Info选择为Program

    Database,Link项的Debug中选择Debug Info和Microsoft

    format。

    5、查看API的错误码,在watch窗口输入@err可以查看或者@err,hr,其中”,hr”表示错误码的说明。

    6、Set Next Statement:该功能可以直接跳转到指定的代码行执行,一般用来测试异常处理的代码。

    7、调试内存变量的变化:当内存发生变化时停下来。

    常见错误

    1、在函数返回的时候程序崩溃的原因

    a)、写自动变量越界

    b)、函数原型不匹配

    2、MFC

    a)、使用错误的函数原型处理用户定义消息

    正确的函数原型为:

    afx_msg LRESULT

    OnMyMessage(WPARAM wParam,LPARAM lParam);

    3、谨慎使用TerminateThread:使用TerminateThread会造成资源泄漏,不到万不得已,不要使用。

    4、使用_beginthreadex,不要使用Create

    Thread来常见线程。

    调试常用快捷键

    单步进入

    F11

    单步跳过

    F10

    单步跳出

    SHIFT+F11

    运行到光标

    CTRL+F10

    开关断点

    F9

    清除断点

    CTRL+SHIFT+F9

    Breakpoints(断点管理)

    CTRL+B 或ALT+F9

    GO

    F5

    Compile(编译,生成.obj文件)

    CTRL+F7

    Build(组建,先Compile生成.obj再Link生成.exe)

    F7

    [番茄花园1]这是什么文件???

    [番茄花园2]???

    [番茄花园3]???

    更多相关内容
  • 调试的技巧:快捷键、需要关注的变量。 如何写出方便维护的代码:使用const修饰变量 和assert()函数。

    什么是调试

    调试(英语:Debugging / Debug),又称除错,编好程序后,用各种手段进行查错和排错的过程。作为程序的正确性不仅仅表现在正常功能的完成上,更重要的是对意外情况的正确处理。
    修正语法错误和逻辑错误的过程。这是保证计算机信息系统正确性的必不可少的步骤。编完计算机程序,必须送入计算机中测试,修正逻辑错误和语法错误。

    2.2 调试的基本步骤

    首先程序员在写程序在写代码的时候可以发现错误,如果没有发现自己的bug,就把他的代码调成release版本,给测试人员。测试工程师以用户的角度也可以发现程序中的错误,会上报给程序员重新更改程序,如果没有发现bug,就会发布给用户。用户在使用产品的时候,也有可能发现bug。当用户发现bug的时候,就会有风险了,例如付费软件给用户带来了损失。

    1. 发现程序错误的存在
    2. 以隔离、消除等方式对错误进行定位
    3. 确定错误产生的原因
    4. 提出纠正错误的解决办法
    5. 对程序错误予以改正,重新测试

    2.3 Debug和Release的介绍

    Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。

    Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优
    的,以便用户很好地使用。

    Windows环境调试

    在环境中选择 debug 选项,才能使代码正常调试。
    debug

    快捷键的使用

    在使用快捷键之前,应该先把键盘上的Fn激活!

    (原因是现在的电脑兼具娱乐的功能,F1~F12在Fn没激活时,充当音量、亮度调节等功能的快捷键)
    F5
    启动调试,经常用来直接跳到下一个断点处。如果没有断点,直接运行到最后一步!

    F9
    创建断点和取消断点
    可以在程序的任意位置设置断点。这样就可以使得程序在想要的位置随意停止执行,继而一步步执行下去。

    F5和F9配合使用。比如我前100行代码都没有问题,101行出现了问题,我不可能从第一行去慢慢调试。正确的做法是设置断点,然后直接跳到断点处,断点之前的代码就不需要观察了。

    F10
    逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或者是一条语句。

    F11
    逐语句,就是每次都执行一条语句,但是这个快捷键可以使我们的执行逻辑进入函数内部(这是最常用的)。

    CTRL + F5
    开始执行不调试,如果你想让程序直接运行起来而不调试就可以直接使用。

    更多快捷键–>

    调试的时候查看程序当前信息

    以下的一切操作都是在调试的时候进行,否则无效。

    1 查看内存信息
    按照如图所示的位置查看内存窗口,如果屏幕足够大,当然可以打开多个窗口。
    查看内存
    调试实例:
    查看内存2
    2 查看临时变量的值

    调试——>窗口——>监视——>监视1
    在调试开始之后,用于观察变量的值。这个是使用的最多的。
    监视窗口

    3 查看调用堆栈
    调试——>窗口——>调用堆栈
    用于观察整个函数的调用逻辑,以这样一个简单的代码举例:

    void test2()
    {
    	printf("test2\n");
    }
    void test1()
    {
    	printf("test1\n");
    	test2();
    }
    void test()
    {
    	printf("test\n");
    	test1();
    }
    int main()
    {
    	test();
    	return 0;
    }
    

    按下F10进入调试,然后调用堆栈。按F11逐语句调试。可以看到这个代码的函数调用逻辑。
    调用堆栈

    4 查看汇编信息
    方法1:调试——>窗口——>反汇编(Alt + 8)

    方法2:右击鼠标——>反汇编(Ctrl+K,G)
    以汇编语言的形式展示。

    5 查看寄存器信息
    调试——>窗口——>寄存器

    ☀如何写出易于调试的代码

    优秀的代码往往要求运行正常、 bug很少、效率高、可读性高、可维护性高、注释清晰、文档齐全。

    常见的coding技巧:

    1. 使用assert
    2. 尽量使用const
    3. 养成良好的编码风格
    4. 添加必要的注释
    5. 避免编码的陷阱。

    我们可以学习一下C语言的库函数是如何写的。以strcpy为例,查找MSDN可知
    strcpy
    下面我将以这个作为测试的代码,模拟出不同层次的strcpy函数。

    #include<string.h>
    int main()
    {
    	//strcpy 字符串拷贝
    	char arr1[20] ="xxxxxxxxx";
    	char arr2[] = "hello";
    
    	strcpy(arr1, arr2);
    	//my_strcpy(arr1, arr2);
    	printf("%s\n", arr1);//字符串拷贝把\0也拷贝进去了
    	return 0;
    }
    

    将自己写的函数命名为my_strcpy()

    写法一:
    只能得到一半的分数。比如这个代码,如果我输入的是空指针那么程序就不能运行!

    void my_strcpy(char* dest, char* src)
    {
    	while (*src != '\0')
    	{
    		*dest = *src;
    		dest++;
    		src++;
    	}
    	*dest = *src;//把最后的\0拿过来
    }
    
    

    写法二:
    这次就能得到七成的分数。需要引入assert()断言函数,防止空指针的传入。

    #include<assert.h>
    void my_strcpy(char* dest, char* src)
    {
    	assert(dest != NULL);//防止传入空指针
    	assert(src != NULL);
    	while (*src != '\0')
    	{
    		*dest = *src;
    		dest++;
    		src++;
    	}
    	*dest = *src;//把最后的\0拿过来
    }
    

    写法三:
    注意别人的函数的返回值是char*类型的,而我们写的是void类型的,如果不保持一致的话那还有仿写的意义吗?
    如果返回的目标空间的地址,那么就可以这样调用:printf("%s\n", my_strcpy(arr1, arr2)),代码更加灵活!

    char* my_strcpy(char* dest, char* src)
    {
    	assert(dest && src);
    	char* ret = dest;//将dest 的地址保存
    	while ('\0'!=src)
    	{
    		*dest = *src;
    		dest++;
    		src++;
    	}
    	return ret;//返回dest的地址
    }
    

    写法四:
    加上const修饰变量,防止被拷贝的和拷贝的数据写错位置了。

    char* my_strcpy(char* dest,const char* src)
    {
    	assert(dest && src);
    	char* ret = dest;//将dest 的地址保存
    	while ('\0'!=src)
    	{
    		*dest = *src;
    		dest++;
    		src++;
    	}
    	return ret;//返回dest的地址
    }
    

    如此一来,就写出了满分代码!

    ☀ const 的使用方法

    const修饰整型变量(这一类的)后,本身不能改变,但是可以通过指针变量p来改变。

    int main()
    {
    	const int n = 10;
    	//n = 20;//不行
    	int* p = &n;
    	*p = 20;//通过指针变量修改n的值
    	printf("%d", n);
    	return 0;
    }
    

    const 放在*左边

    const 修饰的指针指向的内容,表示**“指针指向的变量内容”不能修改;**
    但是,“指针变量本身”是可以改变的。

    int main()
    {
    	const int n = 10,m=200;
    	//n = 10;
    	const int* p = &n;
    	//*p = 20;//不能实现,因为 指针指向的内容 不能通过指针来改变。
    	
    	int** pp = &p;
    	**pp = 20;//不过可以使用二级指针改变n
    	p = &m;//可以实现
    	printf("n=%d,m=%d\n", n,m);
    	return 0;
    }
    

    const如果放在*的右边

    const修饰的是指针变量本身,保证了**“指针变量的内容”不能修改**;
    但是“指针指向的内容”,可以通过指针改变。

    int main()
    {
    	int m = 10,n=100;
    	int* const p = &n;//指向了n
    	//p = &m;//指针变量的内容 不能修改,只能够指向n了
    
    	*p = 20;//指向的n可以修改
    	printf("%d %d\n", m, n);
    	return 0;
    }
    

    编程常见的错误

    1 编译型错误
    直接看错误提示信息(双击),解决问题。或者凭借经验就可以搞定。相对来说简单。
    2 链接型错误
    看错误提示信息,主要在代码中找到错误信息中的标识符,然后定位问题所在。一般是标识符名不
    存在或者拼写错误。
    3 运行时错误
    借助调试,逐步定位问题。最难搞。

    一些调试的实例

    实例一

    求1!+2!+3!+……+n!

    int main()
    {
        int i = 0;
        int sum = 0;//保存最终结果
        int n = 0;
        int ret = 1;//保存n的阶乘
        scanf("%d", &n);
        for (i = 1; i <= n; i++)
        {
            int j = 0;
            for (j = 1; j <= i; j++)
            {
                ret *= j;
            }
            sum += ret;
        }
        printf("%d\n", sum);
        return 0;
    }
    

    可以看出这个代码成功运行,但是结果错的离谱
    在这里插入图片描述
    通过调试,我们可以发现ret的值在循环的时候没有置1,导致数字越来越大。正确的写法如下:

    for (i = 1; i <= n; i++)
    {
        ret *= i;
        sum += ret;
    }
    

    实例二

    为什么会死循环?

    int main()
    {
        int i = 0;
        int arr[10] = { 0 };
        for (i = 0; i <= 12; i++)
        {
            arr[i] = 0;
            printf("hehe\n");
        }
        return 0;
    }
    

    有的编译器下,在栈区i和arr是连续的,数组越界访问,访问到了i,造成循环变量i的改变(下图的调试过程可以看出),最终造成死循环。
    调试结果
    i和arr是局部变量,存放在栈区。栈区上内存的使用习惯是:先使用高地址处的空间,再使用低处地址的空间,随着数组下标的增长,地址是由低到高变化。

    使用release版本调试的时候,不会进入死循环。

    结语

    首先,一定要熟练掌握以上调试技巧。这些都是简单的调试,以后可能会出现很复杂调试场景:多线程程序的调试等。只有基础打得牢,上层建筑才够稳!

    其次,多多使用快捷键,提升效率。

    最后,初学者可能80%的时间在写代码,20%的时间在调试。但是一个程序员可能20%的时间在写程序,但是80%的时间在调试。做好心理准备!

    展开全文
  • C语言位操作

    2021-05-20 05:11:09
    在计算机程序中,数据的位是...C语言提供了位运算的功 能, 这使得C语言也能像汇编语言一样用来编写系统程序。位运算符C语言提供了六种位运算符:& 按位与| 按位或^ 按位异或~ 取反<< 左移>> 右移...

    在计算机程序中,数据的位是可以操作的最小数据单位,理论上可以用“位运算”来 完成所有的运算和操作。一般的位操作是用来控制硬件的,或者做数据变换使用,但是,灵活的位操作可以有效地提高程序运行的效率。C语言提供了位运算的功 能, 这使得C语言也能像汇编语言一样用来编写系统程序。

    位运算符C语言提供了六种位运算符:

    & 按位与

    | 按位或

    ^ 按位异或

    ~ 取反

    << 左移

    >> 右移

    1. 按位与运算 按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1 ,否则为0。参与运算的数以补码方式出现。

    例如:9&5可写算式如下: 00001001 (9的二进制补码)&00000101 (5的二进制补码) 00000001 (1的二进制补码)可见9&5=1。

    按位与运算通常用来对某些位清0或保留某些位。例如把a 的高八位清 0 , 保留低八位, 可作 a&255 运算 ( 255 的二进制数为0000000011111111)。

    应用:

    a. 清零特定位 (mask中特定位置0,其它位为1,s=s&mask)

    b. 取某数中指定位 (mask中特定位置1,其它位为0,s=s&mask)

    2. 按位或运算 按位或运算符“|”是双目运算符。其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。参与运算的两个数均以补 码出现。

    例如:9|5可写算式如下:

    00001001|00000101

    00001101 (十进制为13)可见9|5=13

    应用:

    常用来将源操作数某些位置1,其它位不变。 (mask中特定位置1,其它位为0 s=s|mask)

    3. 按位异或运算 按位异或运算符“^”是双目运算符。其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。参与运算数仍以补码出现,例如 9^5可写成算式如下:

    00001001^00000101 00001100 (十进制为12)

    应用:

    a. 使特定位的值取反 (mask中特定位置1,其它位为0 s=s^mask)

    b. 不引入第三变量,交换两个变量的值 (设 a=a1,b=b1)

    目 标 操 作 操作后状态

    a=a1^b1 a=a^b a=a1^b1,b=b1

    b=a1^b1^b1 b=a^b a=a1^b1,b=a1

    a=b1^a1^a1 a=a^b a=b1,b=a1

    4. 求反运算 求反运算符~为单目运算符,具有右结合性。 其功能是对参与运算的数的各二进位按位求反。例如~9的运算为: ~(0000000000001001)结果为:1111111111110110

    5. 左移运算 左移运算符“<

    6. 右移运算 右移运算符“>>”是双目运算符。其功能是把“>> ”左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的位数。其值相当于除2。

    例如:设 a=15,a>>2 表示把000001111右移为00000011(十进制3)。对于左边移出的空位,如果是正数则空位补0,若为负数, 可能补0或补1,这取决于所用的计算机系统。移入0的叫逻辑右移,移入1的叫算术右移,Turbo C采用逻辑右移。

    main(){

    unsigned a,b;

    printf("input a number: ");

    scanf("%d",&a);

    b=a>>5;

    b=b&15;

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

    }

    再看一例:

    main(){

    char a='a',b='b';

    int p,c,d;

    p=a;

    p=(p<<8)|b;

    d=p&0xff;

    c=(p&0xff00)>>8;

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

    }

    浮点数的存储格式:

    浮点数的存储格式是符号+阶码(定点整数)+尾数(定点小数)

    SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM

    即1位符号位(0为正,1为负),8位指数位,23位尾数位

    浮点数存储前先转化成2的k次方形式,即:

    f = A1*2^k + A2*2^(k-1) + ... + Ak +... +An*2^(-m) (Ai = {0, 1}, A1 = 1)

    如5.5=2^2 + 2^0 + 2^(-1)

    其中的k就是指数,加127后组成8位指数位

    5.5的指数位就是2+127 = 129 = 10000001

    A2A3.....An就是尾数位,不足23位后补0

    所以5.5 = 01000000101000000000000000000000 = 40A00000

    所以,对浮点数*2、/2只要对8位符号位+、- 即可,但不是左移、右移

    关于unsigned int 和 int 的在位运算上的不同,下面有个CU上的例子描述的很清楚:

    [问题]:这个函数有什么问题吗?

    /

    /**

    * 本函数将两个16比特位的值连结成为一个32比特位的值。

    * 参数:sHighBits 高16位

    * sLowBits 低16位

    * 返回:32位值

    **/

    long CatenateBits16(short sHighBits, short sLowBits)

    {

    long lResult = 0; /* 32位值的临时变量*/

    /* 将第一个16位值放入32位值的高16位 */

    lResult = sHighBits;

    lResult <<= 16;

    /* 清除32位值的低16位 */

    lResult &= 0xFFFF0000;

    /* 将第二个16位值放入32位值的低16位 */

    lResult |= (long)sLowBits;

    return lResult;

    }

    /

    [问题的发现]:

    我们先看如下测试代码:

    /

    int main()

    {

    short sHighBits1 = 0x7fff;

    short sHighBits2 = 0x8f12;

    unsigned short usHighBits3 = 0xff12;

    short sLowBits1 = 0x7bcd;

    long lResult = 0;

    printf("[sHighBits1 + sLowBits1] ";

    lResult = CatenateBits16(sHighBits1, sLowBits1);

    printf("lResult = %08x ", lResult, lResult);

    lResult = CatenateBits16(sHighBits2, sLowBits1);

    printf("lResult = %08x ", lResult, lResult);

    lResult = CatenateBits16(usHighBits3, sLowBits1);

    printf("lResult = %08x ", lResult, lResult);

    }

    /

    运行结果为:

    [sHighBits1 + sLowBits1]

    lResult = 7fff7bcd

    lResult = 8f127bcd

    lResult = ff127bcd

    嗯,运行很正确嘛……于是我们就放心的在自己的程序中使用起这个函数来了。

    可是忽然有一天,我们的一个程序无论如何结果都不对!经过n个小时的检查和调试,最后终于追踪到……CatenateBits16() !?它的返回值居然是错的!!

    “郁闷!”你说,“这个函数怎么会有问题呢!?”

    可是,更郁闷的还在后头呢,因为你把程序中的输入量作为参数,在一个简单的main()里面单步调试:

    /

    int main()

    {

    short sHighBits1 = 0x7FFF;

    short sHighBits2 = 0x8F12;

    unsigned short usHighBits3 = 0x8F12;

    short sLowBits1 = 0x7BCD; //你实际使用的参数

    short sLowBits2 = 0x8BCD; //你实际使用的参数

    long lResult = 0;

    printf("[sHighBits1 + sLowBits1] ";

    lResult = CatenateBits16(sHighBits1, sLowBits1);

    printf("lResult = %08x ", lResult, lResult);

    lResult = CatenateBits16(sHighBits2, sLowBits1);

    printf("lResult = %08x ", lResult, lResult);

    lResult = CatenateBits16(usHighBits3, sLowBits1);

    printf("lResult = %08x ", lResult, lResult);

    printf(" [sHighBits1 + sLowBits2] ";

    lResult = CatenateBits16(sHighBits1, sLowBits2);

    printf("lResult = %08x ", lResult, lResult);

    lResult = CatenateBits16(sHighBits2, sLowBits2);

    printf("lResult = %08x ", lResult, lResult);

    lResult = CatenateBits16(usHighBits3, sLowBits2);

    printf("lResult = %08x ", lResult, lResult);

    return 0;

    }

    /

    发现结果竟然是:

    [sHighBits1 + sLowBits1]

    lResult = 7fff7bcd

    lResult = 8f127bcd

    lResult = 8f127bcd

    [sHighBits1 + sLowBits2]

    lResult = ffff8bcd //oops!

    lResult = ffff8bcd //oops!

    lResult = ffff8bcd //oops!

    前一次还好好的,后一次就ffff了?X档案?

    [X档案的真相]:

    注意那两个我们用来当作低16位值的sLowBits1和sLowBits2。

    已知:

    使用 sLowBits1 = 0x7bcd 时,函数返回正确的值;

    使用 sLowBits2 = 0x8bcd 时,函数中发生X档案。

    那么,sLowBits1与sLowBits2有什么区别?

    注意了,sLowBits1和sLowBits2都是short型(而不是unsigned short),所以在这里,sLowBits1代表一个正数值,而sLowBits2却代表了一个负数值(因为8即是二进制1000,sLowBits2 最高位是1)。

    再看CatenateBits16()函数:

    /

    long CatenateBits16(short sHighBits, short sLowBits)

    {

    long lResult = 0; /* 32位值的临时变量*/

    /* 将第一个16位值放入32位值的高16位 */

    lResult = sHighBits;

    lResult <<= 16;

    /* 清除32位值的低16位 */

    lResult &= 0xFFFF0000;

    /* 将第二个16位值放入32位值的低16位 */

    lResult |= (long)sLowBits; //注意这一句!!!!

    return lResult;

    }

    /

    如果我们在函数中用

    printf("sLowBits = %04x ", sLowBits);

    打印传入的sLowBits值,会发现

    sLowBits = 0x7bcd 时,打印结果为

    sLowBits = 7bcd

    而sLowBits = 0x8bcd时,打印结果为

    sLowBits = ffff8bcd

    是的,即使用%04x也打印出8位十六进制。

    因此,我们看出来了:

    当sLowBits = 0x8bcd时,函数中 "lResult |= (long)sLowBits;" 这一句执行,会先将sLowBits转换为

    0xffff8bcd

    再与lResult做或运算。由于现在lResult的值为 0xXXXX0000 (其中XXXX是任何值),所以显然,无论sHighBits是什么值,最后结果都会是

    0xffff8bcd

    而当sLowBits = 0x7bcd时,函数中 "lResult |= (long)sLowBits;" 这一句执行,会先将sLowBits转换为

    0x00007bcd

    再与lResult做或运算。这样做或运算出来的结果当然就是对的。

    也就是说,CatenateBits16()在sLowBits的最高位为0的时候表现正常,而在最高位为1的时候出现偏差。

    [教训:在某些情况下作位运算和位处理的时候,考虑使用无符号数值——因为这个时候往往不需要处理符号。即使你需要的有符号的数值,那么也应该考虑 自行在调用CatenateBits16()前后做转换——毕竟在位处理中,有符号数值相当诡异!]

    下面这个CatenateBits16()版本应该会好一些:

    /

    unsigned long CatenateBits16(unsigned short sHighBits, unsigned short sLowBits)

    {

    long lResult = 0;

    /* 将第一个16位值放入32位值的高16位 */

    lResult = sHighBits;

    lResult <<= 16;

    /* 清除32位值的低16位 */

    lResult &= 0xFFFF0000;

    /* 将第二个16位值放入32位值的低16位 */

    lResult |= (long)sLowBits & 0x0000FFFF;

    return lResult;

    }

    /

    注意其中的 "lResult |= (long)sLowBits & 0x0000FFFF;"。事实上,现在即使我们把CatenateBits16()函数的参数(特别是sLowBits)声明为short,结果也会是 对的。

    展开全文
  • 1、姓 名:学 号:专 业:日 期:指导原则:促进学生针对实际问题,用所学 C语言知识编写符合规范的源程序代码,在某一集成 开发环境下尽一切调试技能调试程序,并对运行结果进行分析处理, 得出正确结论,解决好...

    《C语言程序设计上机指导书及答案》由会员分享,可在线阅读,更多相关《C语言程序设计上机指导书及答案(36页珍藏版)》请在人人文库网上搜索。

    1、姓 名:学 号:专 业:日 期:指导原则:促进学生针对实际问题,用所学 C语言知识编写符合规范的源程序代码,在某一集成 开发环境下尽一切调试技能调试程序,并对运行结果进行分析处理, 得出正确结论,解决好实际问题。更快更好地掌握所学知识,技能和软件的一向开发方法 目的:1,通过上机实验,加深对教材内容的理解,特别是一些语法规定,熟练掌握各种 语法规则。2,通过上机实验,熟悉某个C语言集成开发环境。掌握集成开发环境下程序的编辑、编译与连接、运行的完整过程3,通过上机实验,要学会调试程序。能根据系统给出的“出错信息”,判断错误所在,并修改错误,使程序正确运行。要求:1,复习与本次实验相关的教学内容2。

    2、,了解集成开发环境的操作步骤3,准备好实验内容。对于编程题,一定要自己动手,书写工整,并人工检查无误后 才能上机实验,以提高上机效率。4,要准备好调试和运行程序时所需的数据。5,对运行中可能出现的问题事先作出估计,并对程序中有疑问的地方作上标记,以 便在运行时给予注意。并在程序调试时,把系统给出的出错原因,解决方法等记 载在源程序之后;程序运行结束后,把运行结果也记录下来。6,每个实验应独立完成,对实际问题所编写的源程序需写出完整实验的报告。第一次上机作业熟悉C语言集成开发环境实验目的:1, 熟悉C语言集成开发环境2,掌握集成开发环境下文件的编写与调用,源程序的编译与调试,程序运行结果的观察与。

    3、分析。3, 掌握C语言程序的基本结构实验要求:1, 程序编写完后,要对输入的每一个符号和词进行检查核对,不能有错。2,编写源程序时,不要在中文输入法下进行,也不要有首字符大写,否则调试时,会 有错误。实验内容:1,在D盘新建文件夹:D : C语言程序 XXX(所在班级如0709401) XXX(自己学号或姓名如01),作为以后所做程序的存放位置。注:每次换机器须重复此操作。2, 编辑,编译,运行下面程序并存盘,文件名为ex1_1.c /*输出信息的C源程序,文件名为 ex1_1.c */#i nclude stdio.h ”void mai n() printf( Hello, Everyon。

    4、e n Study hard!n );输出结果为 Hello, Every oneStudy hard!3, 调入文件ex1_1.c,把程序修改成下面形式,运行,存盘,文件名为ex1_2.c/*输出信息的C源程序,文件名为ex1_2.c */#i nclude stdio.h void mai n() printf( Hello, Every one n ); printf( “Study hard!n ”输出结果为 Hello, Every oneStudy hard ,”n ”的作用是 换行4,编辑,编译,运行下面程序并存盘,文件名为ex1_3.c/*计算圆面积的程序,文件名为ex1_3.。

    5、c */#i nclude stdio.h void mai n() float r,area;printf( r=?);scanf( %f ”&r);area=3.1415926*r*r;printf( arear=%fn ,area);area=3.141593area=314.159260第一次运行时输入1,运行结果为 再次运行时输入10,运行结果为把语句 printf( arear=%fn”,area);修改为:printf( arear(%0.1f)=%fn,r,area);后,运行时输入10,这时程序的运行结果为area (10.0) =314.159260操作步骤:一,Turbo。

    6、C 2.0集成开发环境(1)熟悉C语言集成开发环境进入集成开发环境(菜单模式):执行文件TC.EXE文件菜单(file ): FILE中有:NEW (新建文件),LOAD (或OPEN打开或调 入文件),SAVE (保存文件),SAVE AS , QUIT (退出 C 语言集成开发环境)编译菜单(compile) :COMPILE TO OBJ + (路径名 文件名)运行菜单(run):RUN , USER SCREEN选项(option ):DIRECTORY (注明TC。EXE的当前目录路径,路径不符合,编译程序找不到库函数所在头文件,编译会出错)从菜单进入编辑区的按键:En ter从编辑。

    7、区进入菜单的按键:F10注:运行出错时,按 F10也可回到菜单区,按EDIT 进入编辑区(2)掌握 C 语言源程序的编写 (new (FILE),编译(compile to obj (COMPILE), 运行(run (RUN),观察结果(user screen (RUN)四个步骤。编译出错时,按 ENTER键,然后在光标所在行或上一行查找出错位置。同时 在顶行红字部分(英文提示)找出错原因。(3)掌握一定的调试方法。方法:在已编译好的程序中人为制造错误(如删除标点符号,改错保留字(int,二,Visual C+6.0集成开发环境1,printf, scanf),确定出错位置(光标所在行),猜。

    8、测出错原因(根据顶行英文提 示)。启动Visual C+ 6.0环境方法:单击 开始”程序” “Microsoft Visual studio 6.0 - “ Microsoft Visual C+ 6.0 命令,启动 Visual C+ , VC6主窗口如下:菜单栏工具栏标题栏输出区状态栏2.编辑源程序文件(1 )建立新工程项目 单击 文件”-新建”弹出 新建”对话框。41更改4 2打幵文件 文件位彗夹浏兇窗口仃单击工程2,苴击3箍入內 口32 C nwle Asp ication :程名 单击工程”选项卡;单击Win32 Con sole Applicatio n ”选项;工程文件”框中输。

    9、 入项目名(如gc1);位置”框输入文件保存文件夹或单击“”打开文件夹浏览窗口,选择新项目文件所需保存的位置,单击确定”按钮。 弹出 Win32 Con sole Application Step 1of 1 对话框,在对话框中单击An empt project ”按钮和 完成”按钮。系统显示新建工程信息”对话框。单击 确定”按钮。(2)建立新项目中的文件 单击 文件”新建”,弹出 新建”对话框。3输入 文伤名1*单击“文件2,单击弋+-BoureeFiU 选顶 选择 文件”选项卡。单击 C+ Source File ”选项,在 文件”文件框中输入文件名, 单击 确定”按钮。系统自动返回 VC。

    10、6主窗口。 显示文件编辑区窗口,在文件编辑区窗口输入源程序文件。3 ,编译和连接方法一:选择主窗口菜单栏中“编译”菜单项;系统弹出下拉菜单,选择“构件”菜单命令。方法二:单击主窗口编译工具栏上的“ Build ”按钮进行编译和连接。注:.exe。(1)系统对程序文件进行编译和连接,生成以项目名称命名的可执行目标代码文件(2 )编译连接过程中,系统如发现程序有语法错误,则在输出区窗口中显示错误信息,给 出错误的性质、出现位置和错误的原因等。如果双击某条错误,编辑区窗口右侧出现 一个箭头,指示再现错误的程序行。用户据此对源程序进行相应的修改,并重新编译 和连接,直到通过为止。4. 执行方法一:单击。

    11、“编译”菜单中“执行”命令。方法二:单击主窗口编译工具栏上的“ Build Execute ”按钮来执行编译连接后的程序运行成功,屏幕上输出执行结果,并提示信息:“Press any key to contin ue。此时按任意键系统都将返回VC6主窗口。注:在执行程序过程中出现运行错误。用户要修改源程序文件并且重新编译、连接和执行。第二次上机作业掌握基本数据类型在程序中的正确应用实验目的:1熟悉C语言集成开发环境及程序编写、编译、运行,观察运行结果2掌握基本的调试技巧(缺少标点符号,函数名错误或不一致)3 熟悉 C 语言基本数据类型(int, lo ng,un sig ned int,flo。

    12、at,double, char)的输 入,输出格式(%d,%ld,%f,%lf,%c, %o,%x,%u)实验内容:1,输入半径,求圆的面积(要求圆周率用符号常量表示)(查错改错1:圆周率的定义名与使用名不一致;查错改错2:面积的输出格式用 %d )。作业1程序如下,调试改正两处错误 ,正确运行后将文件保存为 ex2_1.c#define pi 3.1415927#in cludestdio.hmain () floatarea,banj ing;prin tf(please en ter a datan);scan f(%f, &banji ng);area=p*banjing*banjin。

    13、g;/*圆周率的定义名pi与使用名 p不一致*/printf(n the area of yuan is %dn,area);/* 面积的输出格式 %d 改为 %f */A)调试,语法错误如下:出错信息为:D:vcfileex1ex.cpp(7) : error C2065: p : undeclared identifier 中文意思为:符号 p没有定义。错误原因及更正:圆周率的定义名pi与使用名p不一致,改为pi运行B)观察及分析运行结果,逻辑错误叭 *D: kvcfileezlDel)iig Veil. eethe a pea uF i/iian zls 976311.353Press 。

    14、any key to continue分析:半径为3时,圆的面积应为:pi X 3 X 3 = 28.2743343,不能为负数。 查错:先查面积变量 area的输出格式,再往上逆推查其运算方法,最后查其定义 错误原因及更正:面积的输出格式%d (整数)改为%f (实数或单精度浮点数)2,调入ex2_1.c另存为ex2_2.c,并做如下修改后,保存调试运行程序,观察系统出出错信息(英文),并翻译成中文。注:每改一次,就调试一次。1) 将语句:float area, banjing; 改为:floatarea, banjing ;则出错信息为:F:C 语言作业 1.cpp(4) : error 。

    15、C2065: floatarea : undeclaredide ntifierF:C 语言作业 1.cpp(4) : error C2065: baniing : undeclared identifierF:C 语言作业 1.cpp(7) : error C2065: area : undeclared identifier中文意思为:文件的第四行有错,符号floatarea没有定义错误原因及更正:floatarea中float 与 area之间少了空格,加上空格2) 将语句:printf (”n ”);改为:printf (”n ”)则出错信息为:F:C 语言作业 1.cpp(6) : 。

    16、error C2146: syntax error : missing ;before identifier scanf中文意思为:文件的第六行有错错误原因及更正:少了“;”,在第六行后加上“;”3) 将语句:scanf(“ f” ,&banjing);为:scan( “ f” ,&banjing);则出错信息为:F:C 语言作业 1.cpp(6) : error C2065: scan : undeclared identifier中文意思为:文件第六行sca n没有定义错误原因及更正:scan后少了 仁加上f4) 将语句:float area, banjing ;中英文标点符号;”或,”,。

    17、改为中文输入法 全角字符后,再输入同样标点则出错信息为:F:C 语言作业 1.cpp(4) : error C2018: unknown character0xa3F:C 语言作业 1.cpp(4) : error C2018: unknown characterOxacF:C 语言作业 1.cpp(5) : error C2146: syntax error : missing ; before identifier pri ntf中文意思为:系统不能识别字符“,” 错误原因及更正:将“,”改为英文输入法输出的“,”第三次上机作业运算符与表达式的使用实验目的:1,熟悉C语言集成开发环境和熟悉。

    18、C语言程序结构2,掌握一定的调试技巧。3,熟悉运算符与表达式的正确使用。 作业内容要求:1,程序填空,以下程序输入3个整数值 给a,b,c,程序把b中的值给a,把c中的值给b,把a中的值给c,交换后输出a,b,c的值,例如输入123,输出a=2,b=3,c=1#in cludestdio.hvoid mai n() int a,b,c, t】prin tf(e nter a,b,c:);scanf(%d%d%d,&a,&b,&c); /* 输入 a,b,c 的值 */t=a;a=b:/*把b中的值给 a,*/b=c;c=t:/*把a的原来值给c*/prin tf(a=%d b=%d c=%dn。

    19、,a,b,c); */1, 填空后,运行程序,结果如下:en ter a, b,c:1 2 3a=2,b=3,c=12, 在程序输出语句前插入语句: clrscr();根据运行结果,说明其作用 TC下清屏命令在程序输出语句后插入语句:getchar();根据运行结果,说明其作用_等待键盘输入字符2,调试以下程序(划横线处有错),写出运行结果并简要回答为什么(即了解程序的 运行过程)#in clude stdio.h”main ()intx,y,z;x=6;y=100;z=(+x)/(y-);printf( x=%d,y=%d,z=%dn ”,x,y,z);z=(x+y)*(x+)printf(。

    20、 X=%d,y=%d,z=%dn ,x,y,z);运行结果:x=7,y=99,z=0x=8,y=98,z=742第四次上机作业掌握顺序结构程序设计实验目的:4,熟悉C语言集成开发环境和熟悉C语言程序结构5,掌握一定的调试技巧。6,熟悉运算符与表达式的正确使用。7,掌握语句的正确书写,学会编写顺序结构的程序。作业内容要求:1,编写程序求解:已知半径r=3厘米(cm).求球的体积v;源程序代码上机调试后,源程序中需修改的对应部分#in cludestdio.h#defi ne pi 3.1415926void mai n()Lfloat a,b,r=3:double v:a=4.0;b=3.0:v。

    21、=(a/b)*pi*r*r*r:prin tf(v=%fn,v);程序运行结果:v=113.0973342,以下叁个程序,选一个做。1) 输入两个整数,求其和,差,积,商和余数2) 输入一个三位数,依次输出其个位数字,十位数字,百位数字。13) 用公式 s a (s b)(s c)求三角形的面积(其中 s a b c ,a,b,c为三角形的三边长)要求:1,确定所需的输入变量,输出变量,中间变量的个数及命名,并为其选取正确 的数据类型。2,根据正确的逻辑顺序书写程序。(变量先说明再赋值后使用;先输入再处理后输出;3,每次输出必须有提示信息。如:printf( n x+y=%f ,x+y); 其。

    22、中:x+y= 是提示信息。题号:第3题源程序代码:# include #in elude void mai n()Jfloat a,b,c:double area;sea nf(%f%f%f&a,&b,&c);if(a=b+c II b=a+c II c=a+b|a源程序中需修改的对应部分#in clude #in elude #in elude main () int a,b,c;float s,are; double s,area;a=3,b=4,c=5;程序:用公式求三角形面积:.(s a)(s b)(s c)s,s=(a b c)printf( enter three datasn”;。

    23、scanf( %d%d%d,a,b,c);scanf(%d%d%d,&a,&b,&c);s=1/2*(a+b+c);area=sqrt(s a)*(s b)*(s c)*s;s=1.0/2*(a+b+c);area=sqrt(s-a)*(s-b)*(s-c)*s);printf( a=%d,b=%d,c=%dnarea=%d ”a,b,c,area); area=%f12, 编程求三角形面积:s 2absinC , (C的单位为度数,库函数中自变量单位为弧 度数)(已知:a=5, b=3, C=30。)注意:1,表达式的正确书写格式,2,程序的设计方法,3,检查、核实程序的顺序的正确性代码:#。

    24、defi ne pi 3.1415927#i nclude #in elude void mai n() int a,b;double c,s;a=5,b=3;c=(1.0/180)*pi*30: s=(1.0/2)*a*b*si n(c);prin tf(s=%lfn,s):k运行结果:s=3.750000第六次上机作业分支结构程序实验目的:1,熟悉输入输出格式的使用2,掌握逻辑运算符的特殊运算规则3,了解简单的分支结构程序设计4,学会阅读程序的基本技巧(参考第七讲:分析程序运行过程) 上机内容:1,阅读下面程序,计算运行结果,然后上机验证。#i nclude void mai n() in。

    25、t c,d,e; double a,b,t; a=3.6,b=-3.2;if(ab)t=a; a=b;b=t;/* 思考该复合语句的功能 */printf( n%5.2f,%5.2f ”a,b)c=1,d=1;e=-c&d-;/*注意运算符的优先级和运算规则*/printf( nc=%d,d=%d,e=%d ”c,d,e);e=+d|c+;pirntf( nc=%d,d=%d,e%d ”,c,d,e);运行结果:-3.20, 3.60c=0,d =1,e=0c=0,d=2,e=02,程序填空,输入x值,计算下面的函数值,并输出结果xx 1y2x 11x 103x 11x 10程序如下:#i n。

    26、cludestdio.hvoid mai n() double x,y;scan f(%lf, &x):I/x类型与输入格式if(x0,b0,c0):n);sca nf(%d%d%d,&a,&b, &c);if(a+bc)&(a+cb )&(b+ca)任意两边之和大于第三边s=1.0/2*(a+b+c);area=sqrt(s*(s_a)*(s_b)*(s_c);printf(area=%6.2fn,area):/ 输岀面积elseprin tf(nthree data a,b,c cant form a tria nglen);运行结果:en ter three positive nu mb。

    27、ers a b c(a0,b0,c0):3 4 5area= 6.002,编程求一元二次方程 ax2+bx+c=0的根根据不同的系数 a,b,c有以下的几种情况:21, a 0,b -4ac0时,方程有两不等实根 x1,x222, a0,b -4ac=0时,方程有两相等实根x1 = x223, a0,b -4ac# include float a ,b,c,disc,x1,x2,y1,y2;prin tf(please en ter:a,b,c n);sea nf(%f,%f,%f, &a,&b,&c):disc=b*b-4*a*c;if(a=0)if (b=0)if (c=0) prin t。

    28、f(the quadratic equatio n has many roots n); else prin tf(the quadratic equati on has no root n);elseLx1=x2=-c/b;prin tf(x 仁x2=%.2fn,x1);Lelseif(disc=0)x1=(-b+sqrt(disc)/(2*a);x2=(b sqrt(disc)/(2*a);prin tf(the roots of the quadratic equati on: x1=%.2f,x2=%.2fn,x1,x2):elsex仁 x2=-b/(2*a);y1=y2=sqrt(a。

    29、bs(disc)/(2*a);prin tf(the roots of the quadratic equati on: x1=%.2f+%.2fi,x2=%.2f-%.2fin,x1,y1,x2,y2): 丄动态测试:数据准备,根据前面分析,应准备 6组数据第一组数据:a=1,b=2,c=-3运行结果:the roots of the quadratic equation:x1=1.00,x2=-3.00第二组数据:a=1,b=2,c=1运行结果:the roots of the quadratic equati on: x1=-1.00,x2=-1.00第三组数据:a=1,b=2,c=2运。

    30、行结果:the roots of the quadratic equati on: x1=-1.00+1.00i,x2=-1.00-1.00i第四组数据:a=0,b=2,c=3运行结果:the roots of the quadratic equati on: x1=x2=-1.5第五组数据:a=0,b=0,c=1运行结果:the quadratic equati on has no any root第六组数据:a=b=c=0运行结果:the quadratic equatio n has many roots第八次上机作业循环结构程序设计(一) 实验目的:1, 掌握程序的基本设计方法(能分析。

    31、具体问题的算法,输入输出,流程)2, 掌握while循环的语义、语法和它的使用。(能根据流程写程序,根据程序写流程)3, 能正确阅读程序,根据问题说明把程序补充完整上机内容:1,填空,使程序完整问题说明:输出所有水仙花数。(水仙花数是三位自然数,其各位数字的立方和等于该数,例:153= 13 53 33 )程序:#i ncludestdio.hmain ()int l,x,y, z;/变量或函数说明1=100;while(l# includefloat h1,h2; h1=50.0;int n;n=1;while( nvoid mai n() int n1,n2,n3;double s1=0,。

    32、s2=0,s3=1;for(n 1=1; n1void mai n() int I,j,sum=0;for(l=101;l=l)sum+=l; /素数条件:jvoid mai n()_Lint a,n ,i=1,s n=0,t n=0;prin tf(a ,n=:);sea nf(%d,%d, &a,&n):while (i#defi ne N 20void mai n()int l,aN,bN; /定义两个数组float s;a0=2; / 数纟组元素初始化b0=1:for(I=1;I#defi ne N 8void mai n() int i,aN=1,2,34567,8;int k,te。

    33、mp;for(i=0:ivoid mai n() int a8=23,145,65,73,12,74,91,5;int i.j.temp.k:for (i=0;iai)Ltemp=ai;ai=aj;aj=temp:亠for(k=0;kb?x:b; x=xc?x:c;return x;第十五次上机作业 函数(二)实验目的:1,能正确理解和阅读带自定义函数的程序。2,进一步熟练掌握自定义函数的定义、说明和调用。3,能熟练使用定义函数编程上机内容:1,程序填空:说明:求一个数组中各元素的最大元并输出。程序:#include sfdio.h”#define N 6main () int aN,l,ma。

    34、x;int maxvalue(int a,i nt m);for(l=0;lmax)max=ak;return max;程序运行结果输入3 2 8769max of the aN is 92,用自定义函数编程:输入三角形的三边的边长,求其面积。面积计算公式:sqrt(p(p-a)(p-b)(p-c) , p为周长的一半。主函数应包含输入无效数据的情况(即 a,b,c不能构成三角形的三边或它们有 个负数)。源程序代码:#includestdio h#in cludemath.hfloat area(float a,float b,float c)float p=(a+b+c)/2;float a。

    35、rea;area=(float)sqrt(p*(p-a)*(p-b)*(p-c);return area:Lvoid mai n()Lfloat a,b,c;prin tf(type in a,b,c n);scan f(%f,%f,%f,&a,&b, &c);if(a+bc&a+cb&b+ca)prin tf(area=%0.2fn,area(a,b,c);else prin tf(error!n);k运行结果:type in a,b,c3,4,5area=6.00第十六次上机作业 函数(三)和预处理实验目的:1, 能熟练使用定义函数编程,理解函数的参数传递过程。2, 能正确阅读带宏定义的程。

    36、序,掌握宏定义的正确替换。3,掌握宏定义和带参数宏定义的简单使用。上机内容:1, 阅读程序,写出程序运行结果并分析原因:程序1:#include sfdio.h”#define P0W1(x) x*x#define P0W2(x)(x)*(x)main () int x=7,y=8;printf( pow 1=%din ”,P0W1(x+y);printf( pow2=%dn ”,P0W2(x+y);运行结果:pow1=71pow2=2252, 程序填空:问题说明:利用下列公式求圆周率n的近似值,借助宏定义修改n值,试计算n的若干近似值。如 N= 10 或 N= 50 或 N= 100) 程序:#i ncludestdio.h#i nclude / 数学库函数#define N 100main () long k;double pi=0.0;for(k=1;k=N;k+)pi+=1.O/(k*k); /累加求和pi=sqrt(6.0*pi); /由公式求圆周率prin tf(PI=%12.8fn ”,pi);运行结果:Pl= 3.132076533,编程:主函数输入自然数 n,然后调用函数 n atural(),最后输出该函数返回之值。函数输 出该函数返回之值。函数 natural(n)计算下列自然数平。

    展开全文
  • c语言执行命令快捷键是什么??

    千次阅读 2021-05-23 12:12:41
    CTRL + SHIFT + E 显示资源视图 F12 转到定义 CTRL + F12 转到声明 CTRL + ALT + J 对象浏览 CTRL + ALT + F1 帮助目录 CTRL + F1 动态帮助 F1 帮助 SHIFT + F1 当前窗口帮助 CTRL + ALT + F3 帮助-搜索 SHIFT + ALT...
  • 2012-05-17 回答不知道您使用的是什么开发工具,如果是visual stdio的话ctrl + shift + b生成解决方案ctrl + f7生成编译ctrl + o打开文件...f4显示项目属性窗口ctrl + shift + e显示资源视图f12转到定义ctrl + f12...
  • 方法1:Ctrl + Tab 方法2:Ctrl + Shift + 8
  • dev新建工程、运行和调试 上一次安装中,曾让你们把安装路径记下来,现在我们可以找到安装路径,拷贝出里面的help文件夹,打开到这里,我们将比较官方的形式来了解以下dev的使用。 1.Editing 在编辑之前,我们需要...
  • 使用VS2019,运行调试需要按Fn+F5,但是快捷键没有反应,这是按着Fn+Ctrl +F~ 就有效果 这时候按下Fn+Esc,然后就可以直接按下F1-F12使用VS的快捷键了。 使用完毕,按下Fn+Esc,又变回了系统的快捷键。 ...
  • C语言简单普及 //整型 int a = 100; //字符串 char *s = "yuanrenxue.com"; //浮点型 float = "3.14"; //双精度浮点型 double = "3.141592633764862"; //指针 int *a_add = &a; //字符串常量 不能修改...
  • C语言基础复习1、三码正数:3码合1 ,正数的反码/补码就是其本身负数:原码就是符号位加上真值的绝对值,即用第一位表示符号,其余位表示值原码:11010101负数的反码是在其原码的基础上, 符号位不变,其余各个位取反...
  • C语言位运算

    2021-05-25 08:41:30
    在计算机程序中,数据的位是...C语言提供了位运算的功能, 这使得C语言也能像汇编语言一样用来编写系统程序。位运算符C语言提供了六种位运算符:& 按位与| 按位或^ 按位异或~ 取反<< 左移>> 右移1....
  • 说来惭愧。今天在q群看一位同学的代码。等我翻来覆去debug一个小时之后,告诉他问题和...f12:转到定义 f11:逐语句 f10:逐过程 f9:设置断点 ctrl+f9:启用/停止断点 f5:调试 另外电脑有fn锁定,用fn+esc才能
  • centos7 使用kubeadm 快速部署 kubernetes 国内源 前言 搭建kubernetes看文档以及资料走了很多弯路,so 整理了最后成功安装的过程已做记录.网上的搭建文章总是少一些步骤,想本人这样的小白总是部署不成功(^_^). ...
  • C语言中的位运算

    2021-05-25 08:41:28
    在计算机程序中,数据的位是...C语言提供了位运算的功能,这使得C语言也能像汇编语言一样用来编写系统程序。位运算符C语言提供了六种位运算符:& 按位与| 按位或^ 按位异或~ 取反<< 左移>> 右移1. ...
  • 嵌入式 C语言 补充

    2021-10-01 17:02:48
    文章目录前言C语言结构体中__packed 和位段的理解1、__packed对齐2、位段共用体 union作用:举个例子assert()assert() 的用法和机制NDEBUG 宏C typedef为基本数据类型定义新的类型名为自定义数据类型(结构体、共用...
  • 初始C语言前4/13

    2021-11-08 17:15:15
    什么是C语言 目录 什么是C语言 1 第一个C语言程序 2 数据类型 3 变量、常量 4 字符串+转义字符+注释 1第一个C语言程序 2数据类型 3变量、常量 4字符串+转义字符+注释
  • CTRL + SHIFT + E 显示资源视图 F12 转到定义 CTRL + F12 转到声明 CTRL + ALT + J 对象浏览 CTRL + ALT + F1 帮助目录 CTRL + F1 动态帮助 F1 帮助 SHIFT + F1 当前窗口帮助 CTRL + ALT + F3 帮助-搜索 SHIFT + ALT...
  • 操作系统开发必备工具bochs调试命令大全
  • C语言函数调用分析

    2021-05-21 05:40:37
    今天突发奇想想要研究一下C语言的函数调用.因为以前有个课程设计涉及到C语言函数返回地址的问题,今天看Thinking in C++的时候,看到类似的东西...就想要验证一下.编译器:gcc4.0.1 on darwin操作系统:Mac OS X 10.5.8...
  • Clion使用笔记(C语言、C++、stm32)
  • C语言连接mysql数据库

    2021-01-18 18:11:21
    操作系统:win7/64编译软件:VS2010数据库:5.7.11从C语言连接mysql数据库包含两个步骤:1 初始化连接句柄结构2 实际创建连接测试代码1:#include "stdafx.h"#include /*socket通信,系统头文件*/#include#include#...
  • Dev-cpp调试教程

    2021-10-29 19:37:07
    鉴于同学们在入门C/C++语言编程,对一些代码的逻辑还不太熟悉,难以发现代码的BUG,如果能掌握一些基本的调试方法就可以如虎添翼,更好地找到程序的漏洞,我在这里写一份Dev-cppIDE的入门调试教程,如有不足请指教...
  • VS2019的常见错误和调试功能

    千次阅读 2021-09-12 15:28:55
    二、VS2019的调试功能(不打断点) 三、VS2019的调试功能(打断点) ​ 四、总结 一、VS2019常见问题 1、scanf问题 很多小伙伴在使用VS2019的时候写了一个带有scanf语句的很简单的代码,然而编译器却给...
  • 只有对应的两个二进位均为1,结果位才为1 ,否则为0。参与运算的数以补码方式出现。例如:9&5可写算式如下: 00001001 (9的二进制补码)&00000101 (5的二进制补码) 00000001 (1的二进制补码)可见9&5=1...
  • c语言总结

    2019-07-17 13:31:04
    stdio.h —— c语言库函数 函数体 —— 执行代码 ‘ \ ’ —— 转义字符 printf("字符串“); return —— 函数的结束,返回值可以通过其带回;返回值为0代表程序正常结束 注释(块注释不能嵌套使用) 快捷键...
  • 在前一篇文章中详细介绍了Android现阶段可以采用的几种反调试方案策略,我们在破解逆向应用的时候,一般现在第一步都回去解决反调试,不然后续步骤无法进行,当然如果你是静态分析的话获取就没必要了。但是有时候...
  • 今天我们继续来看破解apk的相关知识,在前一篇:Eclipse动态调试smali源码破解apk我们今天主要来看如何使用IDA来调试Android中的native源码,因为现在一些app,为了安全或者效率问题,会把一些重要的功能放到native...
  • 文章目录1 需要下载的插件1.1 插件列表1.2 插件离线下载方式2 VS Code远程开发2.1 VS code 远程开发所需插件2.2 远程开发环境配置2.2.1 windows2.2.2 Ubuntu3 CMake大型项目运行和调试3.1 CMakeList.txt构建大型项目...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,398
精华内容 559
关键字:

c语言调试时f12