0

以下代码如何执行(除了第二行中的分号外,代码相同)

这段代码预计会执行并且也会执行。

#include<stdio.h>
#define SWAP(a, b) int t; t=a, a=b, b=t  //note here is no semi-colon at the end
int main()
{
    int a=10, b=12;
    SWAP(a, b);
    printf("a = %d, b = %d\n", a, b);
    return 0;
}

但预计不会运行以下内容,因为SWAP(a, b)将被替换int t; t=a, a=b, b=t;;。所以两个分号应该会产生错误!!!

#include<stdio.h>
#define SWAP(a, b) int t; t=a, a=b, b=t;  //note the semi-colon here
int main()
{
    int a=10, b=12;
    SWAP(a, b);
    printf("a = %d, b = %d\n", a, b);
    return 0;
}
4

4 回答 4

7

杂散的分号变成了一个空语句,在 C 中是完全合法的。

您可以通过在代码中添加一行带有十几个分号的行来证明这一点。

另外,你的宏最好写成:

#define SWAP(a, b) do { int t = a; a = b; b = t; } while (0)

如果您尝试在单个代码块中进行两次不同的交换,这会更好。

于 2013-09-20T18:13:52.617 回答
4

如果在宏中使用,本地范围内的额外分号将永远不会在 C(C99 之后)中产生错误。他们只是引入一个空的声明。你从哪里得到应该是错误的想法?可以编造一个示例,该示例会由于额外的分号而触发“孤立的 else”错误,但您的宏if无论如何都不能使用(见下文)。

在 C89/90 中,可能通过在声明后不经意地放置额外的分号来触发错误,因为在 C89/90 中混合声明和语句是非法的。例如

int a, b;;  /* <- A declaration followed by an empty statement */
int c;      /* <- ERROR: Illegal declaration after a statement */

但在 C99 中这不是问题,因为声明和语句可以混合使用。你SWAP显然是为 C99 实现的,所以这个问题并不立即适用。

值得注意的是,这种实现SWAP非常糟糕而且非常危险。它可能会导致在诸如

if (/* whatever */)
  SWAP(a, b);

最好遵循do/while(0)成语并做类似的事情

#define SWAP(a, b) do { int t; t=a, a=b, b=t; } while (0)

注意 - 最后没有分号。

于 2013-09-20T18:16:29.677 回答
2

分号本身就是一个“空语句”,一个什么都不做的语句。

它有时很有用,但大多数时候它是一个错误。例如,这个 if 语句没有预期的效果:

if (x == y);
{
    z=1;
}

尽管如此,它仍然是 C 语言中一个完全有效的部分。

于 2013-09-20T18:15:12.840 回答
2

使用后

gcc -E file_name.c您将获得第二个代码:-

int t; t=a, a=b, b=t;;

这是一个有效的

相当于

int t; t=a, a=b, b=t;

; // null statement does nothing
于 2013-09-20T18:16:07.843 回答