C语言易忽略点总结

template<class T> inline T gcd (T a, T b){  return b ? gcd(b , a%b) : a ; }  计算最大公约数


用加减法实现交换 且避免溢出   a = a+b-(b=a)

int a = 4

(A)a += (a++); (B) a += (++a) ;(C) (a++) += a;(D) (++a) += (a++);

9 10 10 10 or 9  10 10 11


GUN C编译器的 对C语言的九大扩展!!!

在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。

N / a * a == N &~(a-1)

signed char a; unsigned char b;   a+b  ====>   (int)a  + (int)b

数组初始化   char A[100] = {[0 ... 99] = 78,};

无符号数加法  s = x+y , 若s<x  或 s < y , 则发生溢出!

有符号数加法   s = x+y,若xy同大于0且 s小于x或y 负溢出   若xy同小于0,s大于x或y正溢出

int i = 9;main(){ int i = i;/*与全局变量无关*/} 

C语言 printf("%d  %d\n",m,m++);从右向左入栈!!!

(int&)a就是*(int*)(&a)

x&(x-1)可快速消除x中最后一个1!!!

(x&y) + ( (x^y)>>1 )计算(x+y)/2

两个指针的差值,与指针的数据类型有关,结果是绝对差值/sizeof(类型),即两指针间能容纳 元素的 个数 (指针类型不同无法运算)

<<左移都没有问题  >> 右移会有问题!     unsigned 右移必为逻辑右移(补0) 同java中 >>>     signed 右移通常为算术右移(补最高位)同java中>>   位移长度超字长  会对字长取模再位移  java只支持有符号数

对无符号数进行扩展(赋给更大空间的数据类型),高位补0称为零扩展;有符号数进行扩展,扩展出的位填写原最高位称为符号扩展(同移位运算)

short - >unsigned long  进行转换时,由于原数据有符号,故首先以符号扩展增加位数,再转换为unsigned型

inline 会导致 函数有static特性,故多个编译单元需要inline时将其定义放入头文件。

extern inline 同一编译单元下作为内联,不同编译单元则作为普通引用

sizeof为C/C++语言关键字 度量变量时可以不加括号

使用register修饰的变量长度必须小于整型且不能取地址&

static修饰变量和函数

模块缩写_作用域前缀|数据类型前缀|[指针前缀]|含义标识|数组/结构后缀

                    g/n/f/a     bt/b/c/i/s/l/u/d/f/p/v/st/fp                               _a/_st/_pst 

当心类型的溢出(char!!!)

if(BOOL)  if(nBOOL)

if((fTestVal >= -EPSINON)&&(fTestVal <= EPSINON))

if(NULL == p)  if(NULL != p)

else 与最近的if 相结合

条件判断时对于=的处理

case后面只能是整型或字符型的常量或常量表达式

嵌套循环,长循环在内层效率较高

任何类型指针无需强制转换即可赋给void*(x向上转型)

C语言中函数不声明返回值,默认返回整型

C语言中可以向无参数的函数输入任意参数(必须用void限制,C++则不需要)

 不对void*进行算数运算

const 修饰只读变量 C语言中编译时其值未知,故无法替代#define

数组名的为数据首元素的地址;对数组名取地址,为指向该数据的指针;两者值相同,类型不同,算术运算规则不同

数组名与普通指针的另一不同在于sizeof

数组名与数组名地址后sizeof的不同,sizeof(&数组名) 为普通指针大小

char a[] = "1234567"  sizeof(a) == 8strlen(a) == 7

typedef 用来定义一个变量类型的别名。static 不是变量类型。它定义存放方式。

预处理/**/被替换成空格

y=x/*p    ???

a++  待遇到;或,即一个运算单元结束后开始自增

左移和右移的位数不能大于数据的长度,不能小于0

{}花括号的作用 形成整体 与外界隔绝

优先级   []    ()   .   ->   单目运算   双目运算(运算 比较 逻辑)  赋值   ,

const修饰的只读变量不能用来作为定义数组的维度,也不能放在case关键字后面

预处理中 去注释先于宏替换

宏函数不吝啬括号

_LINE_ _FILE__DATE__TIME__STDC_

#line number ["filename"]

编译器默认将结构和栈中的数据进行内存对齐,未对齐的成员先后移,将每一个成员都对齐到自然边界上,从而导致整个结构的尺寸变大

            char     short    float     double    intlong     longlong     pointer

32        8 16         32        64          32         32            6432

64  816         32        64 32         64            64 64

结构对齐   成员自身对齐值s(基本类型为其数据长度  结构类型为其内最大成员长度)   指定对齐值p  有效对齐值v = min(s,p)  各成员以%v = 0 的地址排列  最后将结构按整体对齐系数min(max(s),p)圆整

32位系统 默认p = 4; 64未系统默认p = 8   内存对齐 平台原因 性能原因

switch 的内容可以是 intchar、枚举、bool

#运算符#define SQR(x) printf("The square of x is %d.\n",((x)*(x)))   SQR(5)The square of x is 25

#define SQR(x) printf("The square of #x is %d.\n",((x)*(x)))        SQR(5)The square of 5 is 25

##运算符#define XNAME(n) x##n XNAME(5)x5

char a[10] extern char a[](正确)extern char* a(错误)

char* a= "abcdefg"extern char* a(正确)extern char a[]  (错误)定义和声明必须一致

char a[10]指向数组a的指针 char (*p)[] = &a失去了数组a元素个数为10的信息

指向数组a的指针 char (*p)[10] = &ap与a保留完全一致的信息

&a 为指向数组的指针 等同于char (*p)[]; 取值时需要**(&a)或**p

研习此代码 二维数组

int main()

{

int a[5][5];

int (*p)[4];

p = a;

printf("%d \n", &p[4][2] - &a[4][2]);

}

C语言中,当一维数组作为函数参数时,编译器总是把它解析成一个指向其首元素地址的指针。这条规则并不是递归的。也就是说只有一维数组才是如此,当数组超过一维时,将第一维改写为指向数据首元素地址的指针后,后面的维再也不可改写。

比如:a[3][4][5]作为参数时可被改写为(*p)[4][5]

(*(char**(*)(char**,char**))0)(char**,char**);


# 可以将宏变量展开为字符串 eg. #define MACRO(a) #a ==> MACRO(abc) => "abc"

##   可以将宏变量连接                           eg  .     #define MACRO(a ,b)  a##b                ==>             MACRO(abc,def )   =>  abcdef 

 当需要 实现 a.b时   无需使用##!!!!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
计算机二级C语言知识点主要包括语法基础、数据类型、运算符、控制语句、函数、数组、字符串、结构体、指针等内容。 首先是语法基础,包括标识符的命名规则、注释的使用方法、变量的定义和声明等。掌握这些基础知识是理解后续知识的基础。 其次是数据类型,C语言中主要包括基本数据类型(如int、float、char等)和派生数据类型(如数组、结构体等)。对各种数据类型的特、表示范围以及存储方式的了解,是编写程序的基础。 运算符包括算术运算符、关系运算符、逻辑运算符、位运算符等。掌握运算符的优先级和结合性,能够正确理解和使用运算符,编写出更加高效、准确的程序。 控制语句主要包括条件语句和循环语句。条件语句使用if-else语句和switch语句进行条件判断和多分支选择。循环语句包括for循环、while循环和do-while循环,用于重复执行一段代码。了解这些控制语句的用法和特,能够正确地控制程序的执行流程。 函数是C语言的重要组成部分,能够提高代码的可重用性和可读性。学习函数的定义、调用和参数传递方式,能够编写出结构清晰、模块化的程序。 数组是一种能够存储多个相同类型数据的容器,了解数组的定义、使用和特,能够处理大量数据,并进行各种操作。 字符串是一组字符的集合,掌握字符串的定义、初始化和操作函数的使用,能够处理字符串相关的操作,如拼接、比较等。 结构体是一种自定义的数据类型,可以包含多个不同类型的数据成员,了解结构体的定义和使用方式,能够处理更加复杂的数据结构。 指针是C语言的重要概念,通过指针可以直接访问内存地址,了解指针的定义、初始化和使用方式,能够灵活地处理内存中的数据。 综上所述,掌握二级C语言知识点,对于理解计算机程序的执行原理、提高编程能力具有重要意义。通过实践和不断的积累,能够有效地应用这些知识点编写出高质量的C语言程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值