【问题标题】:Pre/post increment with #define in c [duplicate]在c中使用#define进行前/后增量[重复]
【发布时间】:2014-11-07 23:11:31
【问题描述】:

我编写了一小段代码,其中我使用了#define 和增量运算符。代码是

#include <stdio.h>
#define square(a) ((a)*(a))

int main ()
{
    int num , res ;
    scanf ("%d",&num ) ;
    res = square ( num++ ) ;
    printf ( "The result is %d.\n", res ) ;
    return 0 ;
}

但在 gcc 中编译时,我收到以下注释和警告:

defineTest.c:8:20: warning: multiple unsequenced modifications to 'num' [-Wunsequenced]
    res = square ( num++ ) ;
                      ^~
defineTest.c:2:21: note: expanded from macro 'square'
    #define square(a) ((a)*(a))
                        ^
1 warning generated.

请解释警告和注意事项。 我得到的输出是:

$ ./a.out
1
结果是 2。

$ ./a.out
2
结果是 6。

同时解释代码的工作原理。

【问题讨论】:

  • 您的 res 变为 res = ((num++)*(num++)) ; 阅读:stackoverflow.com/q/4176328/1870232
  • 你想用square(num++)实现什么
  • 调用未定义的行为——也许是关于该主题的第千个问题。唯一的边缘新奇是预处理器的使用,但结果与所有其他的完全相同。
  • @P0W:C++ 问题并不是指导 C 程序员的最佳方式。
  • 我的口头禅:几乎总是避免使用宏。 (AAAM)

标签: c c-preprocessor pre-increment


【解决方案1】:

您的宏在预处理器展开后将如下所示:

((a++)*(a++))

请注意,a++a = a + 1 相同,因此您可以将扩展宏重写为:

((a = a + 1)*(a = a + 1))

您在一个语句中两次更改 a(或准确地说是 num)的值,这会产生警告,因为这是未定义的行为。

我建议您将宏重写为函数

int square(int x)
{
    return x*x;
}

【讨论】:

    猜你喜欢
    • 2014-12-09
    • 2017-04-30
    • 1970-01-01
    • 2013-10-23
    • 2019-03-27
    • 2011-06-10
    • 1970-01-01
    • 2012-04-09
    • 2012-10-03
    相关资源
    最近更新 更多