C语言的细节问题

来源:互联网 发布:国防军事大数据案例 编辑:程序博客网 时间:2024/04/27 23:16

  • 用宏定义实现比较两个数的大小

#define max(a, b)(((long)((a)- (b))&0x80000000) ? b : a)//即a>=b时返回a, 否则返回b


  • C语言有几个宏定义是大家需要掌握的:

__FILE__包含当前文件名的字符串

__LINE__表示当前行号的整数

__DATA__包含当前日期的字符串

__STDC__如果编译器遵循 ANSI C标准,他就是个非零值

__TIME__包含当前时间的字符串


注意:以上宏单词的两边各两个下划线


  • //以下代码是错误的

用数组的访问形式来修改字符串常量,显然是错误的。会提示段错误。

char *p = "abcdef";

p[1] = 'm';

printf("%s\n", p);


  • /*

野指针的成因主要有三种:

1、指针变量没有被初始化。任何指针变量在被创建时不会被自动成为NULL指针,它的缺省值是随机值,会随便指向一个地方

2、指针p被free或者delete后,没有被置为NULL,让人误以为p是个合法的指针。

3、指针操作超越了变量的作用范围。比如不要返回指向栈内存的指针或者引用,因为栈内存在函数结束时会被释放

*/

//以下代码的指针p还没有被初始化,因此为野指针。执行*p = a;时会出现运行时异常,即提示段错误。此外在编译时也会出现警告,提示p没有初始化

int *p;

int a = 10;

*p = a;

printf("%d", *p);


  • //打印的结果为1

//由此推断C语言逻辑运算的结果为0或者1

printf("%d", 5&&6);

printf("%d", 2 > 1);

  • 算术运算符的优先级(+ - * / %)  >     移位运算符的优先级(>>  <<)       >       关系运算符的优先级(>  >= < <= == !=)     >         按位运算符的优先级(& |  ^)

  > 逻辑运算符的优先级 > 条件运算符的优先级 > 赋值运算符的优先级 > 逗号运算符的优先级

  • #pragma pack(4)//指定对齐方式为4字节对齐
  • 关于sizeof的介绍

1、sizeof是一个运算符而不是一个函数

2、sizeof(数据类型)或者sizeof(变量名或者常量)都正确。即sizeof(表达式),表达式可以是变量名、常量、数据类型名

3、sizeof 变量名是正确的,但是sizeof 类型名是错误的。即sizeof后如果不加括号的话,只能跟变量名。如果直接跟类型名而不加括号,会编译错误。

4、sizeof(数组名)会得到数组所占的字节数。

  • 取模运算符%

1、功能是数学上的求余数运算

2、其两个操作数对象都必须是整数

3、a%b 结果的符号以a的符号为准。例如-5%3=-2 5%(-3)= 2



0 0
原创粉丝点击