昨天,有人问我下面的程序输出结果是什么,特此记录下来
#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语言编程中非常重要的一部分,它可以帮助我们防止出错,提高代码的可移植性和可读性等。宏定义可以封装一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以...
本资源为山东大学信号与系统实验八样例文件及宏定义函数,借助该文件可以较好地复现实验。 详解博客地址:https://blog.csdn.net/m0_52316372/article/details/125612586
在探讨宏定义与函数调用的区别时,我们深入解析它们在C语言编程中的特性、应用场景以及潜在风险,以便更全面地理解这两种编程机制。 ### 宏定义与函数调用的本质区别 #### 宏定义(#define) 宏定义是预处理器的一...
在编程领域,函数模板和宏定义是两种常见的代码复用技术,它们都能帮助开发者提高代码的效率和可维护性。本文将深入探讨这两种方法的原理、优缺点以及使用场景。 函数模板是C++中的一项重要特性,它允许我们创建...
2.编译器会对内联函数的参数类型做安全检查或自动类型转换(同普通函数),而宏定义则不会; 3.内联函数可以访问类的成员变量,宏定义则不能; 4.在类中声明同时定义的成员函数,自动转化为内联函数。文章(一)内联...
若字符串是表达式,我们称之为函数式宏定义,那函数式宏定义与普通函数有什么区别呢?我们以下面两行代码为例,展开描述:函数式宏定义:#define MAX(a,b) ((a)>(b)?(a):(b))普通函数 :MAX(a,b) { return a>b?a:b;}...
`,并且确保所有函数的声明、定义和调用都得到相应更新,这样的工作量巨大且容易出错。利用Source Insight的宏语言,我们可以编写自定义的宏来自动化这个过程,从而大大提高效率并减少错误。 以下是使用Source ...
在“宏#define定义函数妙用”这个主题中,我们主要探讨如何巧妙地利用宏定义来模拟函数,以及在实际编程中的一些应用场景。 首先,宏定义可以创建常量,比如定义`NULL`,在C/C++中通常用来表示空指针。`#define ...
**Source Insight 宏定义详解** Source Insight是一款广受程序员喜爱的源代码查看和编辑工具,以其强大的代码导航、语法高亮和自定义功能而闻名。宏定义是Source Insight中的一个重要特性,它允许用户通过自定义...
宏定义和内联函数都可以用来提高代码的执行效率,但它们在实现方式和使用场景上有所不同。宏定义在预处理阶段进行文本替换,不进行类型检查,而内联函数在编译时进行类型检查。宏定义适用于简单的代码替换,而内联...
- **函数**:对函数中的实参和形参都需要定义类型,二者类型需一致。 - **宏**:宏不存在类型问题,宏名及参数没有类型限制,只是一个符号代表。 4. **返回值**: - **函数**:可以有一个返回值。 - **宏**:...
此宏定义启用或禁用IDLE任务钩子函数。在启用的情况下,用户需要实现一个名为vApplicationIdleHook()的函数,该函数在IDLE任务中周期性地执行,可用于操作系统的功能扩展。 6. #define configUSE_TICK_HOOK 0 此宏...
4. 在某些情况下,为了提高程序执行效率,可以将函数定义转换为宏定义,但要注意这可能会带来维护上的问题。 #### 三、宏定义的最佳实践 虽然宏定义提供了强大的功能,但在实际编程中也需要谨慎使用。以下是一些...
使用宏定义`SQUARE`与定义函数`square`相比,宏定义没有类型检查,而且在宏展开时可能会引入副作用。例如: ```c int i = 1; while (i ) { printf("%d\n", SQUARE(i++)); } ``` 上面这段代码可能不会按照...
宏定义中常见的函数包括数据处理函数(如加减乘除)、逻辑判断函数(如IF-THEN-ELSE)、定时器函数、计数器函数等。这些函数帮助实现动态显示、报警处理、数据记录等功能。 3. **XY曲线绘制**: 在威纶通触摸屏上...
宏定义是C语言中的一种预处理指令,主要用于简化程序编写过程中的某些操作,例如定义常量、函数等。通过宏定义可以将一些常用的表达式或代码段进行封装,以便于在程序中多次调用。 #### 2. 宏定义的基本语法 宏定义...
在C语言中,预处理是程序编译过程中的一个重要阶段,它主要负责处理源代码中的预处理指令,如宏定义、文件包含和条件编译。这些特性使得C语言具有高度的灵活性和可定制性。 宏定义是预处理的核心功能之一,它允许...
InstFileNameDef 在光标处插入宏定义,这样.h文件被多次包含时,编译时只包含一次 * 8. HowToUseMacroFunction 本文所定义宏函数使用说明 ********************************************************************...
与函数不同,宏定义不会为形参分配内存空间。 2. **括号的重要性**:在宏定义中,为了避免意外的操作顺序,建议在形参周围加上括号。例如,在上述 `SQ` 宏的例子中,如果省略了括号,则宏调用可能不会按照预期的方式...