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. 二维数组和指针数组
看这样的两个数组:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | char * cities1[5] = { "Fuzhou" , "Shanghai" , "Beijing" , "Xiamen" , "Quanzhou" }; char cities2[5][10] = { "Fuzhou" , "Shanghai" , "Beijing" , "Xiamen" , "Quanzhou" }; |
因为二维数组的最大长度限制为10个字符,而指针数组存储的是字符串的地址,从存储空间角度说,使用指针数组更为经济;然后修改的话,二维数组是更好的选择。
4. 字符函数库cctype
在头文件cctype(老式风格中为ctype.h)
5. const int * 和 int * const 的区别
1 2 3 | int sloth = 3; const int * ps = &sloth; int * const finger = &sloth; |
这种声明格式使得finger只能只想sloth,但允许使用finger来修改sloth的值。中间的声明不允许使用ps来修改sloth的值,但允许将ps指向另一个位置。
6. 函数指针
直接看例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | 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, 我想这些程序员可能有某种心理阴影, 他们惧怕未经初始化的内存, 所以他们会写出这样的代码:
1 2 3 | char buffer[20]; memset (buffer, 0, sizeof (( char )*20)); strcpy (buffer, "123" ); |
这里的memset是多余的. 因为这块内存马上就被覆盖了, 清零没有意义.
第三: 其实这个错误严格来讲不能算用错memset, 但是它经常在使用memset的场合出现
1 2 3 4 5 6 | int some_func( struct something *a){ … … memset (a, 0, sizeof (a)); … } |
8. 大端格式和小端格式
大端格式:
在这种格式中,字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中
小端格式:
与大端存储格式相反,在小端存储格式中,低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节。
1 2 3 4 5 | 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. 函数引用返回左值
1 2 3 4 5 6 7 8 | 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语言中引入汇编语言
|
14. #pragma once
是个预处理指令,在头文件的最开始加入这条指令表示:这个头文件只被编译一次
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫