如果在 SQUARE 宏中传递前缀变量,为什么结果会有所不同
Why result is different if prefix variable is passed in SQUARE macro?
你能解释一下为什么下面的程序的结果不同吗?
程序:
#define MUL(X) X*X
int main()
{
int i=3;
cout<<MUL(++i)<<"n";
return 0;
}
输出:
25
为了分析这一点,让我们展开宏,它变得++i * ++i
。
从形式上讲,++i * ++i
的行为是不确定的,因为*
不是排序点,++
突变i
。因此,编译器可以执行任何操作,无需进一步解释。
如果您的编译器支持 typeof
(这是编译时可评估的,因此不会执行任何增量)和表达式语句,则宏的安全版本是
#define MUL(i) ({
typeof(i) j = (i);
j*j;
})
尽管完全避免宏并使用函数是明智的。
相关文章:
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 为什么我的变量没有更新,我的 LED 没有亮起?
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 为什么C++有不同的变量初始化方式?
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 为什么未命名的结构内联变量在每个翻译单元中没有相同的地址?
- 为什么我可以将变量存储在不是其最小对齐方式的倍数的地址?
- 为什么thread_local变量在这里从未初始化?
- 为什么内存屏障依赖于变量?
- 为什么我的变量存在于其范围之外
- 为什么我们再次从结构对象创建结构变量?
- 字符串与字符* 作为类成员变量.为什么要使用字符*
- 如何读取文件内容并将其保存到字符串类型变量?为什么有空白空间
- 将char * *变量赋值给char * const *变量——为什么允许这样做?
- 在类中传递私有变量——为什么不允许这样做
- 引用临时变量 - 为什么编译器没有检测到它?
- 访问类中的私有成员变量:为什么这样做
- 全局变量-C++为什么这种方式很危险
- ' ios_base '的标志都是静态const整型变量.为什么可以用' ios_base::setf() '来