#define的小trick

2024-04-12 16:18
文章标签 trick define

本文主要是介绍#define的小trick,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

请看下面这段代码:

#include<stdio.h>
#define SQR(x)  x*x
int main()
{int a;int k=3;a=++SQR(k+1);printf("%d",a);
}

大家觉得结果应该是多少呢?
如果不用编辑器编译运行的话,我相信大家会给出各种不同的答案。
最常见的错误就是先算k+1=4,然后就是4*4+1=17,这个结果看似很对,但却忽略了一个地方,就是#define只做替换不做运算。所以不能先算括号里的k+1,。
那么现在这种答案被否定后,又出现了另外一种答案:
3+1*3+1=7,最后++再加1,所以结果等于8,这个看似很合理,而且离正确的答案已经非常地接近,只差了一步就对了,那么它的问题又出现在哪呢?
其实它这样算还是没有理解#define只做替换不做运算,人为地在++后面给它加了括号,就相当于++(k+1*k+1)。
正确的理解应该是这样的:
++k+1*k+1,这样看的话就对了,由于++运算符的优先级高于+,所以先算++k,k就等于4了,后面的k这时也是4,所以结果就是4+4+1=9。
这是个比较经典的题目,大家能把这题理解的话对于#define应该是没问题了。

这篇关于#define的小trick的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/897621

相关文章

2、#include和#define

#include和#define 一、#include二、#define宏定义1、宏变量2、宏函数 一、#include #include是预处理指令,会将头文件直接替换到文件中。 // hello.hvoid foo() {int c = 0;int d = 1;}// hello.cpp#include "hello.h"int main() {int a =

const与#define的优缺点

1.define由预处理程序处理,const由编译程序处理 2.#define不分内存,因为它是预编译指令,编译前进行了宏替换。const 不一定?某种说法,Const常量是占有内存的被“冻结”了的变量 3.const定义常量是有数据类型的,这样const定义的常量编译器可以对其进行数据静态类型安全检查,而#define宏定义的常量却只是进行简单的字符替换,没有类型安全检查,且有时还会产生边际

【C++】define宏定义中的#,##,@#及\符号

一、# 名称:字符串化操作符 其作:将宏定义中的传入参数名转换成用一对双引号括起来参数名字符串。 使用条件:只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前 举例: #define example1(instr) #instr string str=example1(abc); 将会展成:string str="abc"; 注意:对空格的处理 a、忽略传入参数名前面和后

nable to execute dex: Multiple dex files define Lcom/chinaCEB/cebActivity/R

用proguaid 只混淆Android项目的src下的包的话,如果出现了上面的问题: nable to execute dex: Multiple dex files define Lcom/chinaCEB/cebActivity/R 1.如果你想开发Androidsdk 首先把你的项目的src下面打一个包。 2.然后用proguaid混淆。混淆的时候,有时候老是不成功,然你解决上面的

宏__cplusplus/////ifnbsp;define…

在C与C++混合编写的代码中,我们常常会在头文件里看到如下的声明:   #ifdef __cplusplus //如果定义了表示是c++编译器extern "C" {  #endif  // 在这里写标准c程序   #ifdef __cplusplus  }  #endif   __cplusplus是c++编译器内部定义的宏,如果使用的c编译器__cplusplus不会被定义,所以它用来区分

#define和预处理指令的使用

今天再总结一点#define和预处理指令的使用。 预处理过程扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。可见预处理过程先于编译器对源代码进行处理。 预处理指令是以#开头的代码行,#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。正行语句构成了一条预处理指令,该指令酱紫啊编译器进行编译之前对源代码做某些转换,下面是一些常用的预处理指令, #    空指

汇编语言中出现#include, #define的问题

U_boot源文件中,一些 .S文件中出现了#include, #define,如board\smdk2410目录下的lowlevel_init.S文件: #include <config.h> #include <version.h> /* some parameters for the board */ /*  *  * Taken from linux/arch/arm/boot/co

关于#ifndef,#define,#end的说明

#ifndef,#define,#end 是宏定义的一种---条件编译 这样我直接举个例子好了:我定义两个相同的类A分别在single.h和singlenew.h    single.h: 1 #include <iostream> 2 using namespace std; 3 4 class A 5 { 6 public: 7 A() 8

#define详解

#define的概念: #define命令是C/C++语言中的一个宏定义命令。宏定义将一个标识符定义为一个字符串,源程序中的该标识符均以指定的字符串来代替。预处理命令后通常不加分号。这并不是说所有的预处理命令后都不能有分号出现。由于宏定义只是用宏名对一个字符串进行简单的替换,因此如果在宏定义命令后加了分号,将会连同分号一起进行置换。 该命令有两种格式:一种是简单的宏定义,另一种是带参数的宏定义。

MemSQL Start[c]UP 2.0 - Round 1 C. Magic Trick

Codeforces MemSQL Start[c]UP 2.0 - Round 1 C. Magic Trick 首先,我们先假设有抽出的牌样式为A 则,抽到同样的牌(不是同样类型)的概率为 1 / N 则,抽到不同的牌的概率为 N-1 / N 此时抽到A类型的概率为,在原来的N*M张中去掉我们最先抽出的一张A,再从中抽出剩下的 M-1张A类牌 综上所述,答案为 1 / N + (