C语言易错用法

本文介绍了C语言中的一些易错用法,包括extern声明数组、指针加1、三目运算符、条件编译和位操作运算符的使用。同时提出了良好的C语言编程风格,如typedef枚举定义、宏定义以及指针变量的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一:怎样用extern声明一个数组为外部数组:

方法一:

1、首先定义一个数组,u8 USART_RX_BUF[100];

2、extern u8 USART_RX_BUF[];

方法二:

1、首先定义一个数组,u8 USART_RX_BUF[100];

2、定义一个指针,并绑定数组:u8 *pRxBuf = USART_RX_BUF;

3、这样就可以用extern u8 *pRxBuf去声明。间接的访问数组。

注意:不能直接extern u8 USART_RX_BUF[100],而是先要用指针绑定数组,再声明指针。

二:注意指针加1的用法:


三:C 语言三目运算符 max = (a > b) ? a : b ;  // 取变量a,b中较大一个,并赋值给变量max

条件运算符的一般格式:

表达式1 ? 表达上2:表达式3

举例如下:

max = (a > b) ? a : b ;  // 取变量a,b中较大一个,并赋值给变量max

四:C语言 条件编译#ifdef

1)条件编译:

#ifdef  标示符

程序段1

#else

程序段2

#endif

例如:

#ifdef STM32F10X_HD

大容量芯片需要的一些变量定义

#endif

五:C语言6种位操作运算符

运算符:

1)& :按位与

2)| :按位或

3)^ : 按位异或

4)~ : 取反

5)<< : 左移

6)>> : 右移

六:程序中比较好的C语言风格:

1、typedef enum {FALSE = 0, TRUE = !FALSE} BOOL;

2、#define BT_STATUS_DET()       GPIO_ReadInputDataBit(GPIOB,  GPIO_Pin_12)

3、#define LED_R(statu)      if(statu==HIGH)  GPIO_SetBits(GPIOA,GPIO_Pin_3);\

                                               else             GPIO_ResetBits(GPIOA,GPIO_Pin_3);

七:指针

1、指针变量和普通变量没有任何区别都是一个变量,所占的地址空间都4字节。

2、指针变量存在的意义就是指向别人。

### C语言中的常见错误及其解决方案 #### 1. **语法错误** C语言是一门严格遵循语法规则的语言,初学者常常会因为忽视某些细节而引发语法错误。例如,在声明变量时忘记分号、括号不匹配等问题都是典型的例子[^1]。 ```c // 错误示例:缺少分号 int a = 5 // 正确写法 int a = 5; ``` 为了避免这类问题,建议在编写代码时养成良好的习惯,比如定期检查每行代码的结束符以及括号的配对情况。 --- #### 2. **大小写敏感性** C语言是区分大小写的语言,这意味着`a`和`A`被认为是两个不同的标识符。如果程序员忽略了这一点,则可能导致运行时错误或编译失败[^2]。 ```c // 错误示例:混淆大小写 int A = 10; printf("%d\n", a); // 正确写法 int A = 10; printf("%d\n", A); ``` 为了防止此类错误的发生,可以采用一致的命名约定(如全部使用小写字母或者大驼峰命名法),从而减少因拼写差异引起的麻烦。 --- #### 3. **结构体作用域问题** 当定义了一个全局范围内的结构体类型后,在局部函数内部再次尝试重新定义同名的结构体会引起冲突。这是因为不同作用域下的相同名称可能会相互干扰[^3]。 ```c struct Point { int x, y; }; void exampleFunction() { struct Point { // 局部重定义导致冲突 float z; }; } ``` 解决此问题的方法之一是在整个项目中统一管理数据类型的定义位置,并通过前缀等方式增加唯一性标记。 --- #### 4. **未初始化指针变量** 另一个容易被忽略却极其危险的情况是对指针变量赋值之前就试图访问它们所指向的内容。这通常会造成不可预测的行为甚至崩溃程序执行流程[^4]。 ```c // 错误示例:未经初始化即解引用 int *p; *p = 10; // 安全做法 int value = 10; int *p = &value; *p = 20; // 修改实际存储单元里的数值 ``` 始终记得给任何动态分配资源的对象赋予初始状态是非常重要的一步操作! --- ### 总结 以上列举了几类比较普遍存在于C语言学习过程中的陷阱及其对应的预防措施。掌握这些基础知识有助于提高编码效率并降低调试成本。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值