C语言中的int和printf有什么区别?

3
这个C语句是做什么用的?
i=!({ printf("%d\n",r); });

ir是整数。

我试图使用pycparser解析它,但它无法识别并引发错误:

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

谢谢。


10
在标准的C语言中,这是无效的。 - Oliver Charlesworth
去掉内部的分号。 - SPlatten
3
这是 GNU 语句表达式扩展。 - Stargateur
变量 int r 初始化为什么?这是未定义的行为。 - danglingpointer
3
这不是不等于,而是一元取反和赋值。 - Sourav Ghosh
显示剩余3条评论
2个回答

7

看起来它正在使用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,无论是否出现错误。


3
这不是标准的C语言,而是GCC 语句表达式 扩展,它允许在表达式中放置块,并返回块中最后一个语句的值。
因为此处的块只有一个语句,该语句本身就是一个表达式,所以这等同于:
i = !printf("%d\n",r);

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接