콤마 연산자

Comma operator

CC++ 프로그래밍 언어에서 쉼표 연산자(토큰으로 표시됨) ,)는 첫 번째 피연산자를 평가하고 결과를 삭제한 다음 두 번째 피연산자를 평가하여 이 값(및 유형)을 반환하는 이진 연산자로, 이러한 평가 사이에 시퀀스 포인트가 있다.null

콤마 토큰을 오퍼레이터사용하는 것은 함수 호출과 정의, 변수 선언, 열거 선언 및 유사한 구성에서 사용하는 것과 구별되며, 여기서 구분자 역할을 한다.null

구문

콤마 연산자는 세미콜론문장을 종료하는 방식과 유사한 방식으로 (값을 갖는) 표현식을 구분하고, 표현 순서는 문장 순서가 가새에 둘러싸인 방식과 유사하게 괄호로 묶는다.[1] (a, b, c)일련의 표현이며, 쉼표로 구분되며, 마지막 표현식으로 평가된다.c하는 동안에{a; b; c;}일련의 진술이며 어떤 가치로도 평가되지 않는다.쉼표는 (블록이 아닌) 문 끝에 나타나는 세미콜론과는 달리 두 개의 표현식(쉼표 구분 표현) 사이에서만 발생할 수 있다. 세미콜론은 문을 종료한다.null

콤마 연산자는 어떤 C 연산자보다 가장 낮은 우선순위를 가지며, 시퀀스 포인트의 역할을 한다.쉼표와 세미콜론의 조합에서 세미콜론은 쉼표보다 낮은 우선순위를 가진다. 세미콜론은 문장이 분리되지만 쉼표는 문장에서 발생하는데, 이는 일반적인 구두점으로 사용되는 것과 일치한다.a, b; c, d로 그룹화된다.(a, b); (c, d)왜냐하면 이것들은 두개의 별개의 진술이기 때문이다.null

이 예에서 두 번째 줄과 세 번째 줄 사이의 상이한 동작은 콤마 연산자가 할당보다 우선 순위가 낮기 때문이다.함수가 반환되기 전에 반환 식을 완전히 평가해야 하기 때문에 마지막 예도 다르다.null

/** * 이 라인에서 쉼표는 연산자가 아닌 분리자의 역할을 한다. * 결과: a=1, b=2, c=3, i=0 */ 인트로 a=1, b=2, c=3, i=0;  /** * b의 값을 i에 할당한다. * 콤마는 첫 번째 줄에서 분리자 역할을 하고 두 번째 줄에서 연산자 역할을 한다. * 결과: a=1, b=2, c=3, i=2 */ 인트로 a=1, b=2, c=3;               인트로 i = (a, b);                                   /** * a 값을 i에 할당한다. * 등가: int i = a; int b; * 쉼표는 두 행 모두에서 분리자의 역할을 한다. * 두 번째 라인의 브레이스는 동일한 블록에서 가변 재장착을 방지한다. * 컴파일 오류가 발생할 수 있음. * 선언된 두 번째 b는 초기값이 주어지지 않는다. * 결과: a=1, b=2, c=3, i=1 */ 인트로 a=1, b=2, c=3;                                 { 인트로 i = a, b; }  /** * a 값을 2씩 증가시킨 다음, 연산 결과 a + b 값을 i에 할당한다. * 콤마는 첫 번째 줄에서 분리자 역할을 하고 두 번째 줄에서 연산자 역할을 한다. * 결과: a=3, b=2, c=3, i=5 */ 인트로 a=1, b=2, c=3; 인트로 i = (a += 2, a + b);            /** * a 값을 2씩 증가시킨 다음 a ~ i 값을 저장하고 사용되지 않은 값을 삭제함 * 결과 연산 a + b 값 * 등가: (i = (a += 2)), a + b; * 콤마는 첫 번째 줄에서 분리자 역할을 하고 세 번째 줄에서 연산자 역할을 한다. * 결과: a=3, b=2, c=3, i=3 */ 인트로 a=1, b=2, c=3; 인트로 i; i = a += 2, a + b;  /** * a 값을 i에 할당한다. * 쉼표는 두 행 모두에서 분리자의 역할을 한다. * 두 번째 라인의 브레이스는 동일한 블록에서 가변 재장착을 방지한다. * 컴파일 오류가 발생할 수 있음. * 선언된 두 번째 b와 c는 초기값이 주어지지 않는다. * 결과: a=1, b=2, c=3, i=1 */ 인트로 a=1, b=2, c=3; { 인트로 i = a, b, c; }  /** * 콤마는 첫 번째 줄에서 분리자 역할을 하고 두 번째 줄에서 연산자 역할을 한다. * 사용하지 않은 a와 b 값을 삭제하여 c 값을 i에 할당한다. * 결과: a=1, b=2, c=3, i=3 */ 인트로 a=1, b=2, c=3; 인트로 i = (a, b, c);  /** * 콤마 연산자 시퀀스가 키워드 뒤에 있으므로 4가 아닌 6을 반환함 * return은 최종 rvalue를 평가하는 단일 표현식으로 간주됨 * 하위 표현 c=6. * 쉼표는 이 라인에서 연산자 역할을 한다. */ 돌아오다 a=4, b=5, c=6;  /** * 이전 예시와 동일한 이유로 1이 아닌 3을 반환함. * 쉼표는 이 라인에서 연산자 역할을 한다. */ 돌아오다 1, 2, 3;  /** * 위와 같은 이유로 1이 아닌 3을 반환한다.이 예는 그대로 작동한다. * return은 함수 호출이 아닌 키워드이기 때문이다.비록 컴파일러가 그럴지라도 * 구성 반환(값) 허용, 괄호는 "값"에 대해서만 상대적임 * 반환 키워드에는 특별한 효과가 없다. * 반송은 단순히 표현을 얻으며 여기서 표현은 "(1, 2, 3)"이다. * 쉼표는 이 라인에서 연산자 역할을 한다. */ 돌아오다(1), 2, 3; 

사용하다

콤마 운영자는 사용 사례가 비교적 제한적이다.그것은 첫 번째 피연산자를 삭제하기 때문에, 일반적으로 첫 번째 피연산자가 두 번째 피연산자보다 먼저 배열되어야 하는 바람직한 부작용을 가지고 있는 경우에만 유용하다.또한 특정 숙어 이외에는 거의 사용되지 않으며, 다른 쉼표나 세미콜론과도 쉽게 오인되기 때문에 잠재적으로 혼란스럽고 오류가 발생하기 쉽다.그럼에도 불구하고, 특히 루프와 SFINAE에서 일반적으로 사용되는 특정한 상황이 있다.[2]디버깅 기능이 제한적일 수 있는 임베디드 시스템의 경우, 쉼표 연산자를 매크로와 함께 사용하여 함수 호출을 원활하게 재정의하고 함수 호출을 바로 앞에 코드를 삽입할 수 있다.null

루프용

가장 일반적인 용도는 주로 a for 루프의 초기화 및 증가 표현에서 블록 문을 사용하지 않고 여러 할당 문을 허용하는 것이다.이것은 초등 C 프로그래밍에서 유일하게 관용적인 용법이다.다음 예에서 루프의 이니셜라이저의 순서는 유의하다.

공허하게 하다 회전시키다(마를 뜨다 *s, size_t ) {     마를 뜨다 *맨 처음의;     을 위해 (맨 처음의 = s, s += ; s >= 맨 처음의; --s) {         설탕을 넣다(*s);     } } 

다른 언어에서 이 문제에 대한 대안적인 해결책은 병렬 할당으로, 하나의 문 안에서 여러 개의 할당이 발생할 수 있고, 구문과 의미론도 다르지만 쉼표를 사용한다.이것은 바둑에서 루프와 유사하게 사용된다.[3]null

루프 이니셜라이저(세미콜론의 특수 용도가 있는)의 경우, 특히 해당 문장이 루프 증분(예: 잠시 루프 끝에 있는 경우)과 유사하게 기능할 때 세미콜론 대신 쉼표를 사용할 수 있다.null

++p, ++q; ++p; ++q; 

매크로스

콤마는 전처리기 매크로에서 단일 구문 표현식의 공간에서 여러 작업을 수행하기 위해 사용할 수 있다.null

한 가지 일반적인 용도는 실패한 주장에서 사용자 정의 오류 메시지를 제공하는 것이다.이는 괄호화된 표현식 목록을 에 전달함으로써 이루어진다.assert매크로, 여기서 첫 번째 식은 오류 문자열이고 두 번째 식은 주장되는 조건이다.assert매크로는 주장 실패에 대한 자신의 주장을 그대로 출력한다.예를 들면 다음과 같다.

#include <stdio.h> #include <assert.h>  인트로 본래의 ( 공허하게 하다 ) {     인트로 i;     을 위해 (i=0; i<=9; i++)     {         주장하다( ( "나는 너무 커!", i <= 4 ) );         활자화하다("i = %i\n", i);     }     돌아오다 0; } 

출력:

i = 0 i = 1 i = 2 i = 3 i = 4 단언: 주장.c:6: test_assert: 주장 '("i가 너무 크다!", i <= 4 )는 주장이 실패했다.중단됨

그러나 어설션 매크로는 일반적으로 프로덕션 코드에서 비활성화되므로 디버그 목적으로만 사용하십시오.null

조건

쉼표는 (if, while, do while 또는 for) 조건 내에서 사용할 수 있으며, 특히 함수를 호출하고 결과를 사용하여 다음 블록 범위를 지정할 수 있다.

만일 (y = f(x), y > x) {     ... // x와 y를 포함하는 문장 } 

go에도 유사한 숙어가 존재하는데, if 문장의 구문이 명시적으로 선택적 문을 허용한다.[4]null

콤플렉스 리턴

쉼표는 반환문에 사용할 수 있으며, 전역 변수 또는 아웃 파라미터(참조)에 할당될 수 있다.이 관용구는 실제 반환과 함께 종료되는 블록의 보조 배정이 아니라 해당 배정이 반환의 일부임을 시사한다.예를 들어 글로벌 오류 번호 설정 시:

만일 (실패하다)     돌아오다 (실수하지 않다 = EINVAL, -1); 

이것은 다음과 같이 좀 더 장황하게 쓸 수 있다.

만일 (실패하다) {     실수하지 않다 = EINVAL;     돌아오다 -1; } 

블럭을 피하십시오.

간결성을 위해 다음과 같이 쉼표를 사용하여 블록 및 관련 브레이스를 방지할 수 있다.

만일 (x == 1) y = 2, z = 3; 
만일 (x == 1)     y = 2, z = 3; 

다음 대신:

만일 (x == 1) {y = 2; z = 3;} 
만일 (x == 1) {     y = 2; z = 3; } 

다른 언어

OCamlRuby 프로그래밍 언어에서 세미콜론(";")은 이러한 목적으로 사용된다.자바스크립트[5] [6] C/C++와 같은 방식으로 콤마 연산자를 활용한다.자바에서 쉼표는 다양한 맥락에서 목록의 요소를 구분하는 데 사용되는 구분자 입니다.[7]그것은 운영자가 아니며 목록의 마지막 요소까지 평가하지 않는다.[8]null

참고 항목

참조

  1. ^ "Comma Operator". Microsoft dev docs. Archived from the original (html) on 1 August 2019. Retrieved 1 August 2019. Two expressions separated by a comma are evaluated left to right. The left operand is always evaluated, and all side effects are completed before the right operand is evaluated.
  2. ^ http://en.cppreference.com/w/cpp/language/sfinae
  3. ^ 유효 바둑: "마침내 바둑에는 쉼표 연산자가 없고 ++는 식이 아닌 문입니다.따라서 에 대해 여러 변수를 실행하려면 병렬 할당을 사용해야 한다(+ 및 --는 제외되지만).
  4. ^ Go Programming 언어 사양:If 문장이
  5. ^ "Comma operator". MDN Web Docs. 17 January 2020. Archived from the original (html) on 12 July 2014. Retrieved 25 January 2020. You can use the comma operator when you want to include multiple expressions in a location that requires a single expression.
  6. ^ "Perlop - Perl operators and precedence - Perldoc Browser".
  7. ^ "2.4. Grammar Notation". Oracle Corporation. Archived from the original (html) on 22 July 2019. Retrieved 25 July 2019.
  8. ^ "Is comma (,) operator or separator in Java?".

참고 문헌 목록

  • Ramajaran, V. (1994), Computer Programming in C, New Delhi: Prentice Hall of India
  • Dixit, J.B (2005), Fundamentals of computers and programming in C, New Delhi: Laxmi Publications
  • Kernighan, Brian W.; Ritchie, Dennis M. (1988), The C Programming Language (2nd ed.), Englewood Cliffs, NJ: Prentice Hall

외부 링크