#define a 1和a=1;的区别在什么地方

如题所述

第一种形式是宏形式,第二种是对变量a的初始化或赋值。两者的最大区别是,宏发生在预编译期间,是字面上的替代,是静态的;而变量赋值或初始化是运行时的行为,只有运行这个程序,这段操作才会进行追问

宏在编译的时候就运行了?我小白

不是要有源代码,库例程和启动代码由连接器组合才能运行吗

预编译是什么意思,是在编译的时候吗

追答

编译分为若干个子阶段,预编译是编译的前期阶段,做的是去除注释、将include头文件插入以及宏展开和条件编译的事

宏一般不能叫运行,但从概念上你可以把它认为成被预编译器执行了,不过这种运行不是运行一个程序(如双击运行exe)

追问

宏是指目标代码,源代码这些吗

追答

运行只需要可执行程序和必要的动态连接库就行了。你把两个范畴搞混了,一个范畴是编译时,一个范畴是运行时。对于编译时,必要的是源代码、静态库(包括动态库的导入库),它们的组合依靠连接器,这全是编译时的范畴。

追问

宏形式的实际作用是什么?它是静态的,有什么意义?我可以随意赋值,它也能代替int a;a=1;变量的赋值,运行结果是一样的

追答

这个还是读C语言程序设计那本书吧,或者查百度百科。简要的说,宏一般来定义恒定不变的东西,比如圆周率这样的常数,而变量它的值是随程序运行时刻在变化的,宏定义的数值没法再变化

你觉得可以替代是因为你的程序太短小了,没有什么实际的功能,在实际的程序里变量的值可能来自文件、可能来自网络,也可能是别的函数的中间运算结果,这些是无法用宏来替代的

追问

我才学到常量,替换符,关于宏定义,我是青蛙跳水,噗通,不懂

#define也是替换符

关于它的其他定义,想必有很多

追答

是的,宏不紧能定义常量,还能定义一段代码过程(类似函数但不是函数)比如#define min(x, y) ((x)>(y)?(y):(x)) 这定义了一个能求得两个数中最小值的宏,添加那么多小括号是因为宏展开是按字面替代的方法展开的,这在有些情况下会产生副作用

加小括号是为了防止这种副作用

宏的使用你可以多看看别人的代码

温馨提示:答案为网友推荐,仅供参考
第1个回答  2016-08-13
第一个是字符常量,第二个是变量追答

变量前面要加数据类型

追问

我知道要加,没写,也可以写成define a 2,怎么会是常量呢?

追答

全局都可以使用的

追问

我是菜鸟啊,能解释术语吗,全局包括什么

追答

你多学一段时间就知道了,程序中的全局常量或者全局变量,一旦赋值,不能改变,说的通俗点。相当于“公交车”,就是公共之←_←物,任何人都可以用它……

追问

相当于自己写的函数吗

相当于头文件库例程

可是后面的赋值是可以改变的,不理解

追答

不相当于

追问

那你能站在菜鸟的角度上通俗解释一下吗

追答

其实我也是菜鸟……
/(ㄒoㄒ)/~~

你信吗

#define PI 3.14
这就是一个符号常量,是固定格式,不能乱写,要写在main函数之外,结尾处不能加分号,在程序中其它地方使用PI这个符号常量时,那么PI就会被替换为3.14 进行运算,并且在程序中其它地方PI不能再重新,否则出错……常量是固定不变共享之物,所谓全局就是在任何函数中都可以使用它,PI就是全局符号常量。

追问

我感觉你是大虾

追答

加一句;PI不能再重新赋值,否则出错。

真不是………(๑òᆺó๑)

现在明白没有……?

不,有点明白没有?

追问

明白了,只能断章取义的明白,不过pl也可以赋值为1.14,2.14

#define bl<=3
#define cl=2
#define pl=bl+cl
这样写对不对

我玩过,写在main下也能正常运行
写在printf()或者花括号后面会报错

#define无法写数学符号吗,不能的话,那我举得例子就错了

追答

规范写法是写在main函数上面。不能写运算符

追问

我是新手,观察到赋值都是在循环和打印外面,循环里不能赋值?

EOF的值在哪,我一直不明白机器是怎么比对不等的

EOF!=c,如果不等则执行while循环,c的赋值是char c;c=getchar(),无语了,getchar的值又在哪。。这个函数和一个EOF无值变量是怎么对比不相等的。。。

追答

是编译器比较的?不是机器……

发错了

是编译器比较的。不是机器

追问

EOF是文件结束。。。不太懂是什么a!=EOF,a不等于文件结束?这是什么逻辑,抓狂,那什么等于EOF?打个比方,a=b,ab只是个壳子,ab
不赋值,阿拉伯数字,怎么对比……

第2个回答  2016-08-13
他什么是缩写形式追问

啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊

相似回答