错误、漏洞、问题 - 页 2866 1...285928602861286228632864286528662867286828692870287128722873...3184 新评论 A100 2020.10.05 18:55 #28651 一切都是可能的,只需要添加一个宏就可以了 #define VALUE 10 MACRO( VALUE, VALUE2 ) #define VALUE VALUE2*2 void f( int i = VALUE ) { Print( i ); } void OnStart() { f(); } 结果:20 fxsaber 2020.10.05 19:09 #28652 A100:一切都是可能的,只需要添加一个宏就可以了结果:20。 这是非常好的。我不善于猜谜。 Valeriy Yastremskiy 2020.10.05 19:34 #28653 Vladimir Simakov:对不起,我在试图解释自己的时候弄糊涂了))))。再来一次。在第二次定义VALUE时,没有定义VALUE宏,因此VALUE被定义为,因为TMP过去和现在都是由VALUE定义的。但TMP在第二个VALUE定义后,被扩展为(类似这样))预处理器只是填入它所拥有的东西,如何定义和在哪里定义并不重要。这就是为什么你必须小心对待它。例子。,现在让我们给这个函数添加一个邪恶的东西,即一个副作用而这只是一个铭文,但如果存款取决于这个功能呢? 有趣的)当你得到它时)。 #define VALUE 10 #define TMP VALUE #undef VALUE 答对了,撤销替换后,第一行不再是10,第二行TMP是VALUE,但不是10。也就是说,替代远远不是分配。 Vladimir Simakov 2020.10.05 19:42 #28654 Valeriy Yastremskiy:有趣的)当你得到它时)。答对了,撤销替换后,第一行不再是10,第二行TMP是VALUE,但不是10。也就是说,替代远远不是一种分配。 是的,替代正是替代,一对一的替代。但当您的代码中定义了VALUE宏(不要与预处理器指令 混淆)时,预处理器会进一步展开TMP->VALUE->10,如果没有,则展开TMP->VALUE。在这种情况下,预处理器指令不参与代码本身,它们在编译时不再存在。例子。 #define VALUE 10 #define TMP VALUE void OnStart() { Print(TMP); //10 if (false){ #undef VALUE #define VALUE 20 Print(TMP);} else Print(TMP); //20 } Valeriy Yastremskiy 2020.10.05 19:55 #28655 Vladimir Simakov:是的,替代正是替代,是一对一的替代。简单地说,当在你的代码中进行替换时,定义了VALUE宏(不要与预处理器指令 混淆),预处理器将展开TMP->VALUE->10,如果没有,则展开TMP->VALUE。在这种情况下,预处理器指令不参与代码本身,它们在编译时不再存在。例子。 是的,如果你注释掉第二个VALUE替换20,VALUE变量声明就会消失,编译器就不会看到它,就会责骂) Vladimir Simakov 2020.10.05 20:12 #28656 A100:一切都是可能的,只需要添加一个宏就可以了结果:20 我放弃了)))。 它是如何定义的? MACRO ? A100 2020.10.05 20:50 #28657 Vladimir Simakov:我放弃了)))。如何确定 ? 这么快?并非所有的专家都已加入进来......我们将等待一个星期。 提示:这个方法也适用(但解决方案略有不同)。 #define VALUE1 10 #define VALUE2 5 MACRO2( VALUE1, VALUE12 ) MACRO2( VALUE2, VALUE22 ) #define VALUE1 VALUE12*2 #define VALUE2 VALUE22*3 int f1( int i = VALUE1 ) { return i; } int f2( int i = VALUE2 ) { return i; } void OnStart() { Print(f1(),":",f2()); } 结果:20:15 Andrey Khatimlianskii 2020.10.05 20:59 #28658 Vladimir Simakov:因为TMP过去是,现在也是,由VALUE定义。 这就是 "自上而下 "反驳的地方。 否则,TMP就不是 "按照定义,所以它仍然是定义的",而是之前被10所取代(VALUE被取代)。 因此,预处理器并不是在逐行处理代码。尚待解决的是如何解决。 @A100,如果你不介意的话,简而言之。 没有足够的兴趣去谷歌和阅读,但足够的兴趣去问。 我的逻辑有什么问题? 我想象的是,这些弦是按顺序分析的。所以右边没有未定义的值。 #define VALUE 10 // VALUE = 10 #define TMP VALUE // TMP = 10 #undef VALUE // VALUE = EMPTY #define VALUE (TMP*2) // TMP = 10, следовательно VALUE = 20 fxsaber 2020.10.05 21:05 #28659 A100:提示:这也是可行的(但解决方案略有不同)。 所以在行动上与MACRO和MACRO2相同。 A100 2020.10.05 21:08 #28660 Andrey Khatimlianskii:我的逻辑有什么问题? #define VALUE 10 // VALUE = 10 #define TMP VALUE // TMP = 10 VALUE #undef VALUE // VALUE = EMPTY #define VALUE (TMP*2) // TMP = 10 EMPTY, следовательно VALUE = 20 EMPTY 1...285928602861286228632864286528662867286828692870287128722873...3184 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
一切都是可能的,只需要添加一个宏就可以了
结果:20
一切都是可能的,只需要添加一个宏就可以了
结果:20。
这是非常好的。我不善于猜谜。
对不起,我在试图解释自己的时候弄糊涂了))))。
再来一次。
在第二次定义VALUE时,没有定义VALUE宏,因此VALUE被定义为
,因为TMP过去和现在都是由VALUE定义的。
但TMP在第二个VALUE定义后,被扩展为
(类似这样))
预处理器只是填入它所拥有的东西,如何定义和在哪里定义并不重要。这就是为什么你必须小心对待它。例子。
,现在让我们给这个函数添加一个邪恶的东西,即一个副作用
而这只是一个铭文,但如果存款取决于这个功能呢?
有趣的)当你得到它时)。
答对了,撤销替换后,第一行不再是10,第二行TMP是VALUE,但不是10。也就是说,替代远远不是分配。
有趣的)当你得到它时)。
答对了,撤销替换后,第一行不再是10,第二行TMP是VALUE,但不是10。也就是说,替代远远不是一种分配。
是的,替代正是替代,一对一的替代。但当您的代码中定义了VALUE宏(不要与预处理器指令 混淆)时,预处理器会进一步展开TMP->VALUE->10,如果没有,则展开TMP->VALUE。在这种情况下,预处理器指令不参与代码本身,它们在编译时不再存在。例子。
是的,替代正是替代,是一对一的替代。简单地说,当在你的代码中进行替换时,定义了VALUE宏(不要与预处理器指令 混淆),预处理器将展开TMP->VALUE->10,如果没有,则展开TMP->VALUE。在这种情况下,预处理器指令不参与代码本身,它们在编译时不再存在。例子。
是的,如果你注释掉第二个VALUE替换20,VALUE变量声明就会消失,编译器就不会看到它,就会责骂)
一切都是可能的,只需要添加一个宏就可以了
结果:20
我放弃了)))。
它是如何定义的?
?
我放弃了)))。
如何确定
?
这么快?并非所有的专家都已加入进来......我们将等待一个星期。
提示:这个方法也适用(但解决方案略有不同)。
结果:20:15
因为TMP过去是,现在也是,由VALUE定义。
这就是 "自上而下 "反驳的地方。
否则,TMP就不是 "按照定义,所以它仍然是定义的",而是之前被10所取代(VALUE被取代)。
因此,预处理器并不是在逐行处理代码。尚待解决的是如何解决。
@A100,如果你不介意的话,简而言之。
没有足够的兴趣去谷歌和阅读,但足够的兴趣去问。
我的逻辑有什么问题?
我想象的是,这些弦是按顺序分析的。所以右边没有未定义的值。
提示:这也是可行的(但解决方案略有不同)。
所以在行动上与MACRO和MACRO2相同。
我的逻辑有什么问题?