3

这个 C 语句是做什么的?

i=!({ printf("%d\n",r); });

ir是整数。

我正在尝试使用 pycparser 解析它,它无法识别它并引发错误:

pycparser.plyparser.ParseError::7:6: before: {

谢谢

4

2 回答 2

7

看起来它正在使用GNU C 扩展,该扩展允许在需要表达式的地方编写块语句。块语句的值是块的最后一个表达式的值。

例如:

int x = ({ int a = 1; a+2; });

将初始化x3.

在您的特定情况下,扩展看起来不是很有用,因为:

i=!({ printf("%d\n",r); });

等同于:

i=!printf("%d\n",r);

我猜你的原始代码可能是由一些黑暗魔法宏生成的。

顺便说一句,这段代码没有多大意义。看起来它想检查printf在编写文本时是失败还是成功。但根据规范,printf如果成功则返回写入的字节数,如果错误则返回负值。因此,仅当它写入 0 个字符时它才会返回 0,并且最后不会发生这种情况\n,并且i总是会以 0 结束0,无论是否有错误。

于 2017-12-04T15:05:50.160 回答
3

这不是标准 C,而是 GCC语句表达式扩展,它允许将块放入表达式并返回块中最后一条语句的值。

因为这里的块只有一个语句,它本身就是一个表达式,这相当于:

i = !printf("%d\n",r);

如果返回 0(即成功但未打印任何字符),则设置i为 1 ,否则设置为 0。printf由于这printf将在成功时始终打印至少两个字符,因此i将始终为 0。

于 2017-12-04T15:03:47.800 回答