C中的块语句,逗号和控制表达式

时间:2014-02-14 11:21:49

标签: c c99 c11

我试过阅读标准的相关部分(c99的6.5和6.8),但这让我更加困惑,没有明确的答案。这是有问题的代码:

#include <stdio.h>
#include <time.h>

int t;
#define block {\
    int temp = 1; \
    t = time(NULL); \
    if (t == (time_t) -1 && temp) puts("turbulance ahead!");\
}

int main(){
    if (((block), t%2)) {
        puts("nice 'n even");
    }
    else {
        puts("odd..");
    }
    return 0;
}

代码有效吗c99 / c1x?即使设置了-Wall和-Wextra,它也会在clang和gcc上编译而不会产生任何错误。

3 个答案:

答案 0 :(得分:4)

没有。它在标准C(C99 / C11)下无效。

它在GNU C中有效,这是一个名为statement expressions的扩展名。

答案 1 :(得分:1)

  

它在clang和gcc上编译

不,它没有。将其编译为C语言,而不是作为&#34; GNU goo&#34;语言。

gcc file.c -std=c99 -pedantic-errors -Wall -Wextra

答案 2 :(得分:0)

if (((block), t%2))

这将计算一个语句表达式,后跟一个逗号运算符。块表达式的返回值是块中最后一个语句的值。逗号运算符从左到右进行求值,其值等于最后一个表达式。如果您在gcc中尝试-E选项,您将获得预处理代码,如下所示:

if ((({ int temp = 1; t = time(((void *)0)); if (t == (time_t) -1 && temp) puts("turbulance ahead!");}), t%2)) 

因此if语句中的条件仅由t%2的值决定(按照逗号运算符)。

Is the code valid c99/c1x?

没有。 C99为语句表达式生成警告。