programing

이 3차 조건부입니까?: 올바른(목표) C 구문입니까?

magicmemo 2023. 7. 10. 22:14
반응형

이 3차 조건부입니까?: 올바른(목표) C 구문입니까?

저는 이것이 가능하다고 생각하지 않았지만 분명히 목표 C에서는 허용됩니다.

int a = b ?: c;

여기서 그들이 하는 일을 보면, 그들은 삼원식의 두 번째 부분을 생략하고 있습니다. 만약 b가 0이 아니라면, b는 두 번째 부분으로 사용됩니다.

영리하지만 제가 알기로는 이것은 K&RC와 ANSIC에 반하는 것입니다.

그렇지 않다면, 저는 몇 년 동안 아주 교묘한 구문 트릭에서 빠져 있었습니다... 아아!

업데이트 : gcc입니다.

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

C로의 GNU 확장은 두 번째 피연산자를 생략할 수 있으며, 암시적으로 첫 번째 피연산자를 두 번째 피연산자로 사용할 수도 있습니다.

a = x ? : y;

식은 다음과 같습니다.

a = x ? x : y;

x가 식인 경우에는 한 번만 평가됩니다.식을 평가하는 것이 부작용이 있으면 차이가 큽니다.

이 동작은 두 가지 모두에 대해 정의됩니다.gcc그리고.clang만약 당신이 macOS나 iOS 코드를 만들고 있다면, 그것을 사용하지 않을 이유가 없습니다.

하지만 신중하게 고려하지 않고는 휴대용 코드로 사용하지 않을 것입니다.

$ 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

따라서 정의되지 않은 행동은 여러분이 질문에서 말하는 것을 하는 것입니다. 여러분이 그것에 의존하고 싶지 않더라도 말입니다.

이것은 GNU C 확장입니다.컴파일러 설정을 확인합니다(C 버전을 찾습니다).그것이 Clang의 일부인지 확실하지 않습니다. 제가 얻을 수 있는 유일한 정보는 이 페이지에 있습니다.

소개

이 문서에서는 Clang이 제공하는 언어 확장에 대해 설명합니다.여기에 나열된 언어 확장 외에도 Clang은 광범위한 GCC 확장을 지원하는 것을 목표로 합니다.이러한 확장에 대한 자세한 내용은 GCC 설명서를 참조하십시오.

언급URL : https://stackoverflow.com/questions/8760561/is-this-ternary-conditional-correct-objective-c-syntax

반응형