C - int 不等于 printf?
C - int not-equal to printf?
这个 C 语句的作用是什么?
i=!({ printf("%d\n",r); });
i 和 r 是整数。
我正在尝试使用无法识别它并引发错误的 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
,要么有无错误。
这个 C 语句的作用是什么?
i=!({ printf("%d\n",r); });
i 和 r 是整数。
我正在尝试使用无法识别它并引发错误的 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
,要么有无错误。