博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c陷阱与缺陷
阅读量:2186 次
发布时间:2019-05-02

本文共 1313 字,大约阅读时间需要 4 分钟。

void (*signal(int, void(*)(int)))(int): signal是函数指针, 返回值是指向返回类型为void, 参数为int的函数的指针, 该函数有两个参数一个是int形,一个是函数指针, 该指针指向返回类型为void, 参数为int的函数。

也可定义如下:

typedef void (*HANDLER)(int);

 HANDLER signal(int HANDLER);

 

 

flag & FLAG != 0  相当于flag & (FLAG != 0)

 

hi << 4 + low相当于hi << (4 + low)

 

*p++相当于*(p++), 意为取p值再对p++

 

运算符优先级(从高到低):

1. 括号, ., 数组下标, 取指针,

2. 单目运算符: !, ~, ++, --, -, (type), *, &, sizeof()----sizeof是运算符!, 右结合

3. 双目运算符:

3.1). 算数运算符: *, /, %; 然后+, -.前者高于后者

3.2): 移位运算符:<<, >>

3.3): 关系运算符: <. <=, >, >=; 然后==, !=, 前者高于后者

3.4); 逻辑运算符: &, ^, |; &&, ||

3.5): 条件运算符:? :(三目, 但事实优先级高于=), 右结合

3.6): 赋值运算符: =; 右结合

3.7): 逗号运算符: 用于分隔表达式

 

任意两个逻辑运算符有不同的优先级

a+++b被解释成(a++)+b, 在gcc中测试的结果为, 不能有a+++++b的形式(可能跟gcc的版本有关, 从测试的结果来看是出现了((a++)++)或者(++(++b))的原因, 如果改成(a++) + (++b)则正确编译),

 

c语言初始化列表中允许出现多余的逗号

 

i = 0

while (i<n) {

    y[i] = x[i++];

}

这个表达式是有问题的, 因为不能保证i的自增操作在y取址之前。

 

 

用lint吧

 

如果一个 函数在被申明、定义之前引用, 默认返回整形?!这个能编译过?

 

如果一个函数没有float, short, char类型的参数, 声明的时候可以完全省略形参包括类型说明, 这样做依赖于调用者能给定正确类型的实参, float转换成double, short/char转换成int。如果函数定义的时候形参类型是char, 则可能引起错误。而如果参数类型是int型, 则可以在声明时省略。

 

库函数setbuf()设置输出缓冲区。如setbuf(stdout, buf);

使用fflush清空缓冲区, 并输出缓冲区内容到stdout, 如果是写文件的话, 缓冲写入文件。缓冲区的大小可用宏BUFSIZ在定义缓冲区的时候指定。注意这个buf应该有全局性, 不然在函数退出的时候会被释放。

 

信号处理函数中不能用malloc, 也不能用其他带锁的函数,否则可能造成死锁。 longjmp也不能用。

 

宏定义的时候, 从左开始, 第一个空格之前的是宏, 之后是表达式, 可以有括号, 也可以没有。宏调用的时候有括号不会造成问题。

 

 

 

 

 

 

 

 

转载地址:http://itrkb.baihongyu.com/

你可能感兴趣的文章
seq2seq 的 keras 实现
查看>>
seq2seq 入门
查看>>
什么是 Dropout
查看>>
用 LSTM 做时间序列预测的一个小例子
查看>>
用 LSTM 来做一个分类小问题
查看>>
详解 LSTM
查看>>
按时间轴简述九大卷积神经网络
查看>>
详解循环神经网络(Recurrent Neural Network)
查看>>
为什么要用交叉验证
查看>>
用学习曲线 learning curve 来判别过拟合问题
查看>>
用验证曲线 validation curve 选择超参数
查看>>
用 Grid Search 对 SVM 进行调参
查看>>
用 Pipeline 将训练集参数重复应用到测试集
查看>>
PCA 的数学原理和可视化效果
查看>>
机器学习中常用评估指标汇总
查看>>
什么是 ROC AUC
查看>>
Bagging 简述
查看>>
详解 Stacking 的 python 实现
查看>>
简述极大似然估计
查看>>
用线性判别分析 LDA 降维
查看>>