C - int 不等于 printf?

C - int not-equal to printf?

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

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

ir 是整数。

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

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

谢谢

这不是标准 C,而是 GCC statement expression 扩展,它允许将块放在表达式中,returns 块中最后一条语句的值。

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

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

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

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

例如:

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

将用 3 初始化 x

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

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

等同于:

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

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

顺便说一句,这段代码没有多大意义。看起来它想要检查 printf 是否在写入文本时失败或成功。但是根据规范,如果成功,printf 将 return 写入的字节数,如果出错,则为负值。所以只有当它写入 0 个字符时它才会 return 0,而最后的 \n 不会发生这种情况,并且 i 总是最终成为 0,要么有无错误。