这个C语句的作用是什么?
i=!({ printf("%d\n",r); });
我和 r 是整数。
我正在尝试使用无法识别它的pycparser解析它并引发错误:
pycparser.plyparser.ParseError :: 7:6:之前:{
由于
答案 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。