这是三元条件吗?:正确的(目标)C 语法?

发布于 2024-12-25 13:19:04 字数 257 浏览 0 评论 0原文

我认为这是不可能的,但显然在 Objective C 中这是允许的:

int a = b ?: c;

所以你看到他们在这里做什么,他们省略了三元表达式的第二部分,这样如果 b 不为零,则使用 b作为第二部分。

这很聪明,但据我所知,这违反了 K&RC,可能还违反了 ANSI C。

如果不是,我多年来一直错过一个非常聪明的语法技巧......唉!

更新: 这是海湾合作委员会。

I didn't think this was possible but apparently in Objective C it is allowed:

int a = b ?: c;

So you see what they're doing here, they're leaving out the second part of the ternary expression, such that if b is nonzero, b is used as the second part.

It's clever but as far as I know this is against K&R C, and probably ANSI C.

If not, I've been missing out of a terribly clever syntax trick for years...alas!

Update:
It is gcc.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

幽梦紫曦~ 2025-01-01 13:19:05

来自http://en.wikipedia.org/wiki/%3F%3A

C 的 GNU 扩展允许省略第二个操作数,并隐式使用第一个操作数作为第二个操作数:

<前><代码>a = x ? :是;

表达式相当于

<前><代码>a = x ? x : y;

但如果 x 是一个表达式,则仅计算一次。如果计算表达式有副作用,则差异很显着。

From http://en.wikipedia.org/wiki/%3F%3A

A GNU extension to C allows omitting the second operand, and using implicitly the first operand as the second also:

a = x ? : y;

The expression is equivalent to

a = x ? x : y;

except that if x is an expression, it is evaluated only once. The difference is significant if evaluating the expression has side effects.

娇女薄笑 2025-01-01 13:19:05

此行为是为 gccclang 定义的。如果您正在构建 macOS 或 iOS 代码,则没有理由使用它。

不过,如果没有仔细考虑,我不会在可移植代码中使用它。

This behaviour is defined for both gcc and clang. If you're building macOS or iOS code, there's no reason not to use it.

I would not use it in portable code, though, without carefully considering it.

匿名。 2025-01-01 13:19:05
$ cat > foo.c
#include <stdio.h>

int main(int argc, char **argv)
{
  int b = 2;
  int c = 4;
  int a = b ?: c;
  printf("a: %d\n", a);
  return 0;
}
$ gcc -pedantic -Wall foo.c
foo.c: In function ‘main’:
foo.c:7: warning: ISO C forbids omitting the middle term of a ?: expression

所以不,这是不允许的。在这种情况下,gcc 发出的内容是这样的:

$ ./a.out 
a: 2

因此,未定义的行为就是执行您在问题中所说的操作,即使您不想依赖它。

$ cat > foo.c
#include <stdio.h>

int main(int argc, char **argv)
{
  int b = 2;
  int c = 4;
  int a = b ?: c;
  printf("a: %d\n", a);
  return 0;
}
$ gcc -pedantic -Wall foo.c
foo.c: In function ‘main’:
foo.c:7: warning: ISO C forbids omitting the middle term of a ?: expression

So no, it's not allowed. What gcc emits in this case does this:

$ ./a.out 
a: 2

So the undefined behaviour is doing what you say in your question, even though you don't want to rely on that.

药祭#氼 2025-01-01 13:19:05

这是一个 GNU C 扩展。检查编译器设置(寻找 C 风格)。不确定它是否是 Clang 的一部分,我能得到的唯一信息是在 此页面

简介

本文档描述了 Clang 提供的语言扩展。除了此处列出的语言扩展之外,Clang 还旨在支持广泛的 GCC 扩展。有关这些扩展的更多信息,请参阅 GCC 手册。

This is a GNU C extension. Check you compiler settings (look for C flavor). Not sure if it's part of Clang, the only information I could get is in this page:

Introduction

This document describes the language extensions provided by Clang. In addition to the language extensions listed here, Clang aims to support a broad range of GCC extensions. Please see the GCC manual for more information on these extensions.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文