zoukankan      html  css  js  c++  java
  • VC++学习笔记(1)——C++语法注意点

    1. 结构Struct和共用体Union

          共用体是一种数据格式,它能够存储不同的数据类型,单只能同时存储其中的一种类型。如结构可以同时存储int、long和double,共用体只能存储int、long或double。

    2. 使用cin.get(char)

          使用cin输入,将忽略空格和换行符,而发送给cin的输入被缓冲,这意味着用户必须按下回车才可以把输入的内容发送给程序。

    这里可以选择采用cin.get(char)进行补救,最后输入Ctrl+Z执行EOF结束。

    3. 二维数组和指针数组

          看这样的两个数组:

    char* cities1[5] =
    {
    "Fuzhou",
    "Shanghai",
    "Beijing",
    "Xiamen",
    "Quanzhou"
    };
    char cities2[5][10] =
    {
    "Fuzhou",
    "Shanghai",
    "Beijing",
    "Xiamen",
    "Quanzhou"
    };

          因为二维数组的最大长度限制为10个字符,而指针数组存储的是字符串的地址,从存储空间角度说,使用指针数组更为经济;然后修改的话,二维数组是更好的选择。

    4. 字符函数库cctype

          在头文件cctype(老式风格中为ctype.h)

    image

    5. const int * 和 int * const 的区别

    int sloth = 3;
    const int * ps = &sloth;
    int * const finger = &sloth;
    这种声明格式使得finger只能只想sloth,但允许使用finger来修改sloth的值。中间的声明不允许使用ps来修改sloth的值,但允许将ps指向另一个位置。

    6. 函数指针

    直接看例子:

    double betsy(int);
    double pam(int);
    void estimate(int lines, double (*pf)(int));
    int main()
    {
    int code;
    cout << "How many lines of code do you need? ";
    cin >> code;
    cout << "Here's Betsy's estimate: \n";
    estimate(code, betsy);
    cout << "Here's Pam's estimate: \n";
    estimate(code, pam);
    return 0;
    }
    double betsy(int lns)
    {
    return 0.05 * lns;
    }
    double pam(int lns)
    {
    return 0.03 * lns + 0.0004 * lns * lns;
    }
    void estimate(int lines, double (*pf)(int))
    {
    cout << lines << " lines will take ";
    cout << (*pf)(lines) << " hour(s) \n";
    }

     

    7. memset

    void *memset(void *s,  int c, size_t n);

    memset:作用是在一段内存块中填充某个给定的值,它对较大的结构体或数组进行清零操作的一种最快方法。

    常见的三种错误

    第一: 搞反了c 和 n的位置.

    一定要记住 如果要把一个char a[20]清零, 一定是 memset(a, 0, 20) 
    而不是 memset(a, 20,  0) 

    第二: 过度使用memset, 我想这些程序员可能有某种心理阴影, 他们惧怕未经初始化的内存, 所以他们会写出这样的代码:

    char buffer[20];
    memset(buffer, 0, sizeof((char)*20));
    strcpy(buffer, "123");

    这里的memset是多余的. 因为这块内存马上就被覆盖了, 清零没有意义. 

    第三: 其实这个错误严格来讲不能算用错memset, 但是它经常在使用memset的场合出现

    int some_func(struct something *a){
    …
    …
    memset(a, 0, sizeof(a));
    …
    }

     

    8. 大端格式和小端格式

     大端格式:

    在这种格式中,字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中
    小端格式:

    与大端存储格式相反,在小端存储格式中,低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节。

    short int x;
    char x0,x1;
    x=0x1122;
    x0=((char*)&x)[0];  //低地址单元
    x1=((char*)&x)[1];  //高地址单元

    若x0=0x11,则是大端; 若x0=0x22,则是小端......

     

    9. volatile用法

    一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
    1) 并行设备的硬件寄存器(如:状态寄存器)
    2) 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
    3) 多线程应用中被几个任务共享的变量

     

    10. CTime类

    ① 定义一个CTime类对象 CTime time;

    ② 得到当前时间 time = CTime::GetCurrentTime();

    ③ GetYear( ),GetMonth( ), GetDay( ), GetHour( ), GetMinute( ), GetSecond( ), GetDayOfWeek( ) 返回整型(int)对应项目

    ④ 将当前时间格式化 CString date = time.Format("%Y-%m-%d %H:%M:%S %W-%A");

    说明:

    1) 结果为:2006-10-13 17:23:47 41-Friday

    2) 格式符号说明

    %a —— 星期(缩写英文),如Fri;

    %A —— 星期(全写英文),如Friday

    %b —— 月份(缩写英文),如Oct

    %B —— 月份(全写英文),如 October

    %c —— 月/日/年 时:分:秒,如 10/13/06 19:17:17

    %d —— 日期(1 ~ 31)

    %H —— 时(24小时制)(0 ~ 23)

    %I —— 时(12小时制)(0 ~ 12)

    %j —— 一年当中的第几天,(1 ~ 366)

    %m —— 月份(数字 1 ~ 12)

    %M —— 分(0 ~ 59)

    %p —— 12小时中的A M/PM指示,或者AM,或者PM

    %S —— 秒(0 ~ 59)

    %U —— 一年中的第几周,星期日作为每周的第一天(0 ~ 53)

    %w —— 星期(数字表示,0 ~ 6,0代表星期日)

    %W —— 一年中的第几周,星期一作为每周的第一天(0 ~ 53)

    %x —— 月/日/年,%c的前半段

    %X —— 时/分/秒,%c的后半段

    %y —— 年份(不带世纪,如 06)

    %Y —— 年份(带世纪,如 2006)

    %z,%Z —— 时区名称或缩写,如果时区未知,此字符为空,如“中国标准时间”

    %% —— %
    “#”标志的含义:

    ① %#a, %#A, %#b, %#B, %#p, %#X, %#z, %#Z, %#% ——“#” 被忽略

    ② %#c —— 把%c中的数字变成英文,再在前面加上星期, 如:“Tuesday, March 14, 1995, 12:41:29”.

    ③ %#x —— 把%x中的数字变成英文,再在前面加上星期,如:Tuesday, March 14, 1995

    ④ %#d, %#H, %#I, %#j, %#m, %#M, %#S, %#U, %#w, %#W, %#y, %#Y —— 如果开 头为0,去掉开头的0

    11. typeof简化指向多维数组的指针

    typeof int int_array[4];

    int_array *ip = ia;

    for(int_array *p = ia; p != ia + 3; ++p)

    {

        for(int *q = *p; q != *p + 4; ++q)

        {

            cout << *q << endl;

        }

    }

    12. 函数引用返回左值

    char &get_val(string &str, string::size_type ix)
    {
        return str[ix];
    }
    string s("a value");
    cout << s << endl;
    get_val(s, 0) = 'A';
    cout << s << endl;

    13. 在C语言中引入汇编语言

    extern "C" __declspec(dllexport) int add(int a, int b)
    {
        int c;
        __asm
        {
            mov eax, a;
            add eax, b;
            mov c, eax;
        }
        return c;
    }

    14. #pragma once

    是个预处理指令,在头文件的最开始加入这条指令表示:这个头文件只被编译一次

  • 相关阅读:
    Java实现 蓝桥杯 算法训练 画图(暴力)
    Java实现 蓝桥杯 算法训练 画图(暴力)
    Java实现 蓝桥杯 算法训练 相邻数对(暴力)
    Java实现 蓝桥杯 算法训练 相邻数对(暴力)
    Java实现 蓝桥杯 算法训练 相邻数对(暴力)
    Java实现 蓝桥杯 算法训练 Cowboys
    Java实现 蓝桥杯 算法训练 Cowboys
    55. Jump Game
    54. Spiral Matrix
    50. Pow(x, n)
  • 原文地址:https://www.cnblogs.com/liping13599168/p/1979692.html
Copyright © 2011-2022 走看看