`

宏定义函数

 
阅读更多

昨天,有人问我下面的程序输出结果是什么,特此记录下来

 

#include <iostream>

#define put(x) ((x)*(x))

using namespace std;

int main() {

	int a[3] = {1,2,3};
	int i = 0;
	int b = 3;
	int c;
	c = put(a[i++]);
	cout << c << endl;

	getchar();
	return 0;
}

 

用到了宏定义函数,在使用时需要展开,即

c = (a[i++]) * (a[i++]);

在vs 2008的环境下,输出是1, a[0]*a[0] = 1

个人的理解为当i++在一条语句当中出现两次时,编译器会做优化,即 i 先保持不变,取a[0]  a[0] 之后,i 自增两次变成2。

 

#include <iostream>

#define put(x) ((x)*(x))

using namespace std;

int main() {

	int a[3] = {1,2,3};
	/*int i=0;
	cout << a[i++] << endl;*/
	int i = 0;
	int b = 3;
	int c;
	c = put(a[++i]);
	cout << c << endl;

	getchar();
	return 0;
}

 

稍稍做些变化,将上面的i++ 编程 ++i ,c = (a[++i]) * (a[++i]);  ++i 出现两次在一个语句中。

此时,编译器在做处理时,会先将i 自增两次,最后结果为a[2]*a[2] = 9

 

总结出这一类编译器的规律, 即i++可以认为是先取i的值,后对i进行自增处理,则索性全部先取值,后自增。

++i 可以认为是先自增,再取值,则索性全部自增之后,再进行操作。

分享到:
评论

相关推荐

    C语言宏定义和宏定义函数

    C语言宏定义和宏定义函数 C语言宏定义是C语言编程中非常重要的一部分,它可以帮助我们防止出错,提高代码的可移植性和可读性等。宏定义可以封装一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以...

    山东大学信号与系统实验八样例文件及宏定义函数

    本资源为山东大学信号与系统实验八样例文件及宏定义函数,借助该文件可以较好地复现实验。 详解博客地址:https://blog.csdn.net/m0_52316372/article/details/125612586

    宏定义和函数调用的区别

    在探讨宏定义与函数调用的区别时,我们深入解析它们在C语言编程中的特性、应用场景以及潜在风险,以便更全面地理解这两种编程机制。 ### 宏定义与函数调用的本质区别 #### 宏定义(#define) 宏定义是预处理器的一...

    函数模板与宏定义

    在编程领域,函数模板和宏定义是两种常见的代码复用技术,它们都能帮助开发者提高代码的效率和可维护性。本文将深入探讨这两种方法的原理、优缺点以及使用场景。 函数模板是C++中的一项重要特性,它允许我们创建...

    浅谈内联函数与宏定义的区别详解

    2.编译器会对内联函数的参数类型做安全检查或自动类型转换(同普通函数),而宏定义则不会; 3.内联函数可以访问类的成员变量,宏定义则不能; 4.在类中声明同时定义的成员函数,自动转化为内联函数。文章(一)内联...

    函数式宏定义与普通函数的区别

    若字符串是表达式,我们称之为函数式宏定义,那函数式宏定义与普通函数有什么区别呢?我们以下面两行代码为例,展开描述:函数式宏定义:#define MAX(a,b) ((a)&gt;(b)?(a):(b))普通函数 :MAX(a,b) { return a&gt;b?a:b;}...

    宏(#define)定义函数妙用

    在“宏#define定义函数妙用”这个主题中,我们主要探讨如何巧妙地利用宏定义来模拟函数,以及在实际编程中的一些应用场景。 首先,宏定义可以创建常量,比如定义`NULL`,在C/C++中通常用来表示空指针。`#define ...

    sourceInsight宏定义

    **Source Insight 宏定义详解** Source Insight是一款广受程序员喜爱的源代码查看和编辑工具,以其强大的代码导航、语法高亮和自定义功能而闻名。宏定义是Source Insight中的一个重要特性,它允许用户通过自定义...

    C语言中的宏定义与内联函数:深入理解与实践

    宏定义和内联函数都可以用来提高代码的执行效率,但它们在实现方式和使用场景上有所不同。宏定义在预处理阶段进行文本替换,不进行类型检查,而内联函数在编译时进行类型检查。宏定义适用于简单的代码替换,而内联...

    论述含参数的宏与函数的优缺点

    - **函数**:对函数中的实参和形参都需要定义类型,二者类型需一致。 - **宏**:宏不存在类型问题,宏名及参数没有类型限制,只是一个符号代表。 4. **返回值**: - **函数**:可以有一个返回值。 - **宏**:...

    Freertos之系统配置宏定义解析

    此宏定义启用或禁用IDLE任务钩子函数。在启用的情况下,用户需要实现一个名为vApplicationIdleHook()的函数,该函数在IDLE任务中周期性地执行,可用于操作系统的功能扩展。 6. #define configUSE_TICK_HOOK 0 此宏...

    C++宏定义说明(详解)

    4. 在某些情况下,为了提高程序执行效率,可以将函数定义转换为宏定义,但要注意这可能会带来维护上的问题。 #### 三、宏定义的最佳实践 虽然宏定义提供了强大的功能,但在实际编程中也需要谨慎使用。以下是一些...

    c/c++宏定义 宏定义的入门教材 基础

    使用宏定义`SQUARE`与定义函数`square`相比,宏定义没有类型检查,而且在宏展开时可能会引入副作用。例如: ```c int i = 1; while (i ) { printf("%d\n", SQUARE(i++)); } ``` 上面这段代码可能不会按照...

    威纶通触摸屏设计,宏定义,操作使用说明

    宏定义中常见的函数包括数据处理函数(如加减乘除)、逻辑判断函数(如IF-THEN-ELSE)、定时器函数、计数器函数等。这些函数帮助实现动态显示、报警处理、数据记录等功能。 3. **XY曲线绘制**: 在威纶通触摸屏上...

    宏定义引用

    宏定义是C语言中的一种预处理指令,主要用于简化程序编写过程中的某些操作,例如定义常量、函数等。通过宏定义可以将一些常用的表达式或代码段进行封装,以便于在程序中多次调用。 #### 2. 宏定义的基本语法 宏定义...

    宏定义宏与函数的区别文件包含条件编译PPT课件.pptx

    在C语言中,预处理是程序编译过程中的一个重要阶段,它主要负责处理源代码中的预处理指令,如宏定义、文件包含和条件编译。这些特性使得C语言具有高度的灵活性和可定制性。 宏定义是预处理的核心功能之一,它允许...

    Source Insight 自定义宏函数

    InstFileNameDef 在光标处插入宏定义,这样.h文件被多次包含时,编译时只包含一次 * 8. HowToUseMacroFunction 本文所定义宏函数使用说明 ********************************************************************...

    c语言带参数的宏定义

    与函数不同,宏定义不会为形参分配内存空间。 2. **括号的重要性**:在宏定义中,为了避免意外的操作顺序,建议在形参周围加上括号。例如,在上述 `SQ` 宏的例子中,如果省略了括号,则宏调用可能不会按照预期的方式...

    C语言宏定义使用分析

    C语言宏定义是预处理器(Preprocessor)提供的一种文本替换机制,它允许程序员在编译期间替换特定的标识符(宏名称)为指定的文本(宏字符串)。在宏定义中,宏名称和宏字符串的区分至关重要,它们之间通过空格进行...

Global site tag (gtag.js) - Google Analytics