一. 简介
前面几篇学习了 C语言中基础问题,文章如下:
常见C语言基础题说明一-CSDN博客
常见C语言基础说明二:位运算问题-CSDN博客常见C语言基础说明三:static修饰的函数或变量-CSDN博客常见C语言基础说明二:位运算问题-CSDN博客
本文继续学习 嵌入式C开发中,可能涉及的一些C语言基础问题。
二. 常见C语言基础说明三:#define 宏定义 与 a--
1. #define 的使用
#define的用法分为两种:
(1) 无参宏定义:其一般形式为“#define 宏名 字符串”。例如,“#define PI 3.14159”,在预处理阶段,编译器会将所有的PI替换为3.14159。需要注意的是,宏名的定义通常使用大写字母,以区别于变量;宏定义末尾不需要加分号;宏定义不分配内存,而变量定义会分配内存。此外,如果字符串过长,可以分成几行写,除了最后一行外,每行的后面都加一个反斜杠(续行符)
(2) 带参宏定义:其一般形式为“#define 宏名(参数表) 字符串”。例如,“#define MAX(a, b) ((a) > (b) ? (a) : (b))”,在预处理阶段,编译器会将所有的MAX(a, b)替换为((a) > (b) ? (a) : (b))。需要注意的是,带参宏定义中的参数没有类型,预处理器只进行简单的文本替换,不进行任何类型检查或计算。为了避免出现错误,最好将宏定义中的参数和操作符都用括号括起来,以确保运算的优先级正确。
有如下 #define 宏定义,计算如下结果:
#include <stdio.h>
#define SUM(A, B) A+B
int main(void)
{
int a = 5;
int b= 6;
int c = 0;
c = 2*SUM(a, b+1);
printf("%d\n", c);
return 0;
}
分析:
#define宏定义 在C语言中,这是一种预处理命令,用于将一个标识符(宏名)定义为一个字符串(替换文本)。
其本质是一种文本替换,预处理程序在编译前会进行宏替换,用被定义的字符串替换程序中的宏名。
因此,c = 2*SUM(a, b+1) 经过(预处理阶段后)文本替换展开后为:
c = 2*a+b+1,也就是 2*5 + 6 +1为 17。
2. a-- 操作
执行如下代码,计算如下结果:
#include <stdio.h>
int main(int argc, char* argv)
{
int a = 5;
while(a--)
{
printf("%d", a);
}
return 0;
}
打印结果如下:
43210
分析如下:
a-- 操作:首先获取变量 a 的当前值,然后将该值减 1,最后将减后的值重新赋值给变量 a。
也就是说先在 a 所在的表达式中使用a的当前值,之后让a减1。
而--a 是先减少后使用,让a先减1,然后在a所在的表达式中使用a的新值
所以,打印结果为: 43210