【问题标题】:C - int not-equal to printf?C - int 不等于 printf?
【发布时间】:2017-12-04 14:57:19
【问题描述】:

这个 C 语句是做什么的?

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

ir 是整数。

我正在尝试使用 pycparser 解析它,它无法识别并引发错误:

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

谢谢

【问题讨论】:

  • 这在标准 C 中无效。
  • 去掉里面的分号。
  • 这是一个 GNU 语句表达式扩展。
  • int r 初始化为什么?这是未定义的行为。
  • 这是不等于,而是一元的否定和赋值。

标签: c pycparser


【解决方案1】:

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

例如:

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 结尾,无论是否有错误。

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-03
      • 1970-01-01
      • 2021-09-23
      • 2010-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多