C - int不等于printf?

时间:2017-12-04 14:57:19

标签: c pycparser

这个C语句的作用是什么?

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

r 是整数。

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

  

pycparser.plyparser.ParseError :: 7:6:之前:{

由于

2 个答案:

答案 0 :(得分:7)

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

例如:

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

将使用x初始化3

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

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

与:

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

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

顺便说一句,这段代码没有多大意义。看起来它想要检查printf在写入文本时是否失败或成功。但是根据规范,printf将返回成功时写入的字节数或错误时返回的负值。因此,只有在写入0个字符时它才会返回0,而最后一个\n不会返回,而i总是最终成为0,无论是否有错误

答案 1 :(得分:3)

这不是标准C,而是GCC statement expression扩展,它允许在表达式中放置块并返回块中最后一个语句的值。

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

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

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