这个C语句是做什么用的?
i=!({ printf("%d\n",r); });
i和r是整数。
我试图使用pycparser解析它,但它无法识别并引发错误:
pycparser.plyparser.ParseError: :7:6: before: {
谢谢。
i=!({ printf("%d\n",r); });
i和r是整数。
我试图使用pycparser解析它,但它无法识别并引发错误:
pycparser.plyparser.ParseError: :7:6: before: {
谢谢。
看起来它正在使用GNU C扩展,允许在期望表达式的位置编写块语句。块语句的值是该块最后一个表达式的值。
例如:
int x = ({ int a = 1; a+2; });
将使用3
来初始化x
。
在您的特定情况下,该扩展似乎并不是很有用,因为:
i=!({ printf("%d\n",r); });
等同于:
i=!printf("%d\n",r);
我猜你原来的代码可能是通过某种黑魔法宏生成的。
顺便说一下,这段代码没有太多意义。它似乎想检查printf
在写入文本时是否失败或成功。但根据规范,如果成功,printf
将返回写入的字节数,否则将返回负数值。因此,它只会在写入0个字符时返回0,而加上\n
后这不会发生,i
将始终为0,无论是否出现错误。
i = !printf("%d\n",r);
printf
返回0(即成功但未打印任何字符),则将i
设置为1,否则设置为0。由于此printf
在成功时始终至少打印两个字符,因此i
将始终为0。