C语言笔记(二)

注释



编译器会用空格代替代码中原来的注释,并先于预处理指令执行
/*…*/ 这种形式的注释不能嵌套
只要斜杠(/)和星号(*)之间没有空格,都会被当作注释的开始。例如这样:
y = x/*p;

\ 是一个接续符,表示断行。编译器会将反斜杠剔除掉,跟在反斜杠后面的字符自动接续到前一行。但是注意:反斜杠之后不能有空格,反斜杠的下一行之前也不能有空格。(有的编译器有空格可以通过)。\ 还能被用作转义字符的开始标识。

位运算符



交换两个变量的值:a ^= b; b ^= a; a ^= b;

0x01<<2+3;
// ==32
// "+"号的优先级比移位运算符的优先级高

在 32 位系统下:

0x01<<2+30;
0x01<<2-3;

左移和右移的位数不能大于数据的长度,不能小于0。(有的编译器还是可以通过的)

对于有符号数,在>>右移时,符号位将随同移动。当为正数时,最高位补0;

而为负数时,符号位为 1,最高位是补 0 或是补 1 取决于编译系统的规定。Turbo C 和很多系统规定为补 1。

常用的位操作宏:

#define  SETBIT(x, y)  ((x) |=  (y))
#define  CLRBIT(x, y)  ((x) &= ~(y))
#define TOGLBIT(x, y)  ((x) ^=  (y))
#define TESTBIT(x, y)  ((x) &   (y))
#define SETBIT(x, y)  ((x) |= 1<<(y))
#define CLRBIT(x, y)  ((x) &= ~(1<<(y)))

花括号


char a[10]{ = “abcde”};

花括号的作用就是打包。

自加减++、--


i=3;
(++i)+(++i)+(++i);  //未定义行为,取决于编译器
// TCC:15,    VC6:16,    GCC:18
i=3;
(i++)+(i++)+(i++);

自加或自减运算是在本计算单位计算结束( 遇到 , 或 ; )之后再自加或自减。

int i,j;
i=0;
j=(i++,i++,i++);    //j=2,i=3

i=0;
j=(++i,++i,++i);    //j=3

/ 和 %



有2组计算

3/2; (-3)/2; 3/(-2); (-3)/(-2);
3%2; (-3)%2; 3%(-2); (-3)%(-2);

优先级



. []和() 的优先级比 * 高
== 和 != 优先级高于位操作
== 和 != 优先级高于赋值符
算术运算符高于位移运算符

预处理



预处理指令是编译器的功能,不是C语言的一部分。

宏定义

ANSI 标准 C 还定义了如下几个宏:
_LINE_ 表示正在编译的文件的行号
_FILE_ 表示正在编译的文件的名字
_DATE_ 表示编译时刻的日期字符串,例如: "25 Dec 2007"
_TIME_ 表示编译时刻的时间字符串,例如: "12:30:55"
_STDC_ 判断该文件是不是定义成标准 C 程序

下面的写法都是对的:

#define EMPTY
# define EMPTY

在使用宏函数的时候,宏名和参数之间的空格会被编译器忽略掉。定义宏的时候空格是有效的。

#error 预处理指令的作用是,编译程序时,只要遇到 #error 就会生成一个编译错误提示消息,并停止编译。其语法格式为:
#error error-message

#line 的作用是改变当前行数和文件名称,它们是在编译程序中预先定义的标识符。命令的基本形式如下:
#line number["filename"]

#pragma 指令的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。

#和##都是预处理命令。

断言assert

#if !defined(NDBUG)
#define assert(p)    if(!(p)){fprintf(stderr,        "Assertion failed: %s, file %s, line %d\n",        #p, __FILE__, __LINE__);abort();}
#else
#define assert(p)
#endif

main函数



无参的写法

int main(void)

有参的写法

int main(int argc, char *argv[])
int main(int argc, char **argv)

argc -- 命令行参数总个数,包括 可执行程序名

argv[0] -- 可执行程序名

argv[i] -- 第 i 个参数

例子

# ./a.out Love Live !

该例子中 argc 为4,argv[0]=a.out, argv[1]=Love, argv[2]=Live, argv[3]=!

数组 int a[5];



定义一个数组 a 时,编译器根据指定的元素个数和元素的类型分配确定大小的一块内存,并把这块内存的名字命名为 a
名字 a 一旦与这块内存匹配就不能被改变。a[0],a[1]等为 a 的元素,但并非元素的名字。数组的每一个元素都是没有名字的。

&a[0]和&a 的区别[I]

a[0]是一个元素,a 是整个数组,虽然&a[0]和&a的值一样,但其意义不一样。

前者是数组首元素的首地址,而后者是数组的首地址

数组名 a 作为左值和右值的区别

a 作为右值时其意义与&a[0]是一样,代表的是 数组首元素的首地址,而不是数组的首地址。

a 不能作为左值!只能访问数组的某个元素而无法把数组当一个总体进行访问。

&a[0]和&a 的区别[II]

int main()
{
    char a[5] = {‘A‘,‘B‘,‘C‘,‘D‘};
    char (*p3)[5] = &a;
    char (*p4)[5] = a;
    return 0;
}

p3 和 p4 都是数组指针,指向的是整个数组。p3 这个定义的“=”号两边的数据类型完全一致,而 p4 这个定义的“=”号两边的数据类型就不一致了。左边的类型是指向整个数组的指针,右边的数据类型是指向单个字符的指针。但由于 &a 和 a 的值一样,而变量作为右值时编译器只是取变量的值,所以运行并没有什么问题。

p3+1 和 p4+1 的值又是多少呢?

C 语言中,当一维数组作为函数参数的时候,编译器总是把它解析成一个指向其首元素首地址的指针。

指针



野指针产生的原因

定义指针变量时未初始化;指针释放后之后未置空。free和delete只是把指针所指的内存给释放掉,但并没有把指针本身干掉。此时指针指向的就是“垃圾”内存。释放后的指针应立即将指针置为NULL,防止产生“野指针”。

指针的使用

1. 定义指针变量的同时最好初始化为 NULL,
char *p = NULL;
2. 用完指针之后也将指针变量的值设置为 NULL,
free(p);
p = NULL;

时间: 2024-08-05 19:28:36

C语言笔记(二)的相关文章

CSS语言笔记&lt;二&gt;

CSS属性 尺寸属性 任何html元素都具有宽和高,在CSS中用px来表示大小,也可以用百分号“%”. px:像素 width:宽 height:高 border:边框 padding:内边距 margin:外边距 backgroun:背景 字体属性 font-family:设置字体 font-weight:粗细,值:bold(加粗) font-style:斜体,值:italic(斜体) font-size:文字大小 font:简写的形式 文本属性 color:颜色,值:可以是单词.10进制.1

JavaScript--基于对象的脚本语言学习笔记(二)

第二部分:DOM编程 1.文档象模型(DOM)提供了访问结构化文档的一种方式,很多语言自己的DOM解析器. DOM解析器就是完成结构化文档和DOM树之间的转换关系. DOM解析器解析结构化文档:将磁盘上的结构化文档转换成内存中的DOM树 从DOM树输出结构化文档:将内存中的DOM树转换成磁盘上的结构化文档 2.DOM模型扩展了HTML元素,为几乎所有的HTML元素都新增了innerHTML属性,该属性代表该元素的"内容",即返回的某个元素的开始标签.结束标签之间的字符串内容(不包含其它

C++语言笔记系列之十二——C++的继承

C++的继承 1.继承方式 public(公有继承) 派生类中的成员可以访问基类的public成员和protected成员,但不能访问基类的private成员. 派生类的对象只能访问基类的public成员. protected(保护继承),private(私有继承) 派生类中的成员可以访问基类的public成员和protected成员,但不能访问基类的private成员. 派生类的对象不能访问基类的任何成员. 2.例子 example 1: #include <iostream.h> clas

Go语言学习笔记(二) [变量、类型、关键字]

日期:2014年7月19日 1.Go 在语法上有着类 C 的感觉.如果你希望将两个(或更多)语句放在一行书写,它们 必须用分号分隔.一般情况下,你不需要分号. 2.Go 同其他语言不同的地方在于变量的类型在变量名的后面.例如:不是,int a,而是 a int.当定义了一个变量,它默认赋值为其类型的 null 值.这意味着,在 var a int后,a 的 值为 0.而 var s string,意味着 s 被赋值为零长度字符串,也就是 "". 3.Go语言的变量声明和赋值 在Go中使

#r语言(二)笔记

#r语言(二)笔记 #早复习 #概述:R是用于统计分析.绘图的语言和操作环境 #对象: #数据类型--统称为对象 #向量(vector):用于存储数值型.字符型或逻辑型数据的一维数组. #定义向量: v<-1 v1<-c(1,2,3) 或者 assign('v1',c(1,2,3)) v<-1:10 #1~10 is.vector(v) #向量的输出: v 或者 print(v1) #向量的操作函数: #排序:sort(v1) 倒序: rev(v1) #最大值 最小值 平均值 max(v

2. 蛤蟆Python脚本学习笔记二基本命令畅玩

2. 蛤蟆Python脚本学习笔记二基本命令畅玩 本篇名言:"成功源于发现细节,没有细节就没有机遇,留心细节意味着创造机遇.一件司空见惯的小事或许就可能是打开机遇宝库的钥匙!" 下班回家,咱先来看下一些常用的基本命令. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/48092873 1.  数字和表达式 看下图1一就能说明很多问题: 加法,整除,浮点除,取模,幂乘方等.是不是很直接也很粗暴. 关于上限,蛤蟆不太清楚

Emacs 笔记二

Emacs 笔记二 Table of Contents 1. 前言 2. emacs基本操作(常用快捷键) 3. emacs模式讲解 4. emacs缓冲区 5. org mode 5.1. 列表 5.2. 快键键 5.3. 内嵌元素(插入代码什么的) 5.4. 表格 1 前言 最近在学着写博客,发现MarkDown真乃神器,于是去找了很多markdown的工具,发现作业部落 最好的那个,而无意间又发现了org-mode火爆到极致 非常被人推崇,其实作业部落 已经是能很完美的满足我的需求了,但是

《Programming in Lua 3》读书笔记(二十二)

日期:2014.8.6 PartⅣ The C API 26 Extending Your Application 使用Lua很重要的一点是用来做配置语言.配合主语言做一些功能的配置. 26.1 The Basics 有的时候程序需要配置一些功能信息,很多时候可能有许多别的方法比用lua做配置要更简单:如使用环境变量或者读取文件,读取文件涉及到文件的解析.如果使用Lua进行配置的话,相当于用lua文件替代了要读取的如csv.txt文件等. 使用Lua进行配置的时候,就需要使用Lua API去控制

《R实战》读书笔记二

第一章 R简介 本章概要 1安装R 2理解R语言 3运行R程序 本章所介绍的内容概括如下. 一个典型的数据分析步骤如图1所示. 图1:典型数据分析步骤 简而言之,现今的数据分析要求我们从多种数据源中获取数据.数据合并.标注.清洗和分析,并且把分析的结果进行展示,形成报告或者系统,辅助决策.R能够满足现今数据分析的要求. 为什么用R? R是一个适合统计分析和绘图的环境与语言.它是开源.免费的,获得世界范围社区支持.统计分析和绘图工具已经很多了,例如:SPSS,SAS,Excel,Stata和Min