2010-12-28 10 views
2

의 한계 내가 this 질문을 읽고 내가 쉼표 연산자를 사용하여를 수행 할 수없는 일들이 무엇인지 그것이에 추가 할. 나는이 작업을 수행 할 수 있습니다 이것은 나에게 많은 혼란했습니다쉼표 연산자

int arr[3]; 
arr[0]=1,arr[1]=2,arr[2]=3; 

을하지만 수행 할 때

int arr[3],arr[0]=1,arr[1]=2,arr[2]=3; 

를 그것은 나에게 컴파일러 오류를 제공합니다.

쉼표 연산자의 제한 사항은 무엇입니까?

+0

또한 재미있는 질문은 쉼표 연산자로 할 수있는 일입니다. 쉼표 연산자를 오버로딩하는 것은 표현식 유형이 무효인지 여부, 즉 컴파일 타임에 테스트하는 데 적합한 도구입니다. 'foo'는 사용자가 정의한 타입이고' foo (& operator, (T, foo)) [2]; 템플릿이 있습니다. . "T = void"와 함께 사용하면 기본 쉼표 연산자가 사용됩니다. –

답변

10

C에서 쉼표를 모두 사용하는 것이 쉼표 연산자의 인스턴스가 아니라는 점을 한 가지 깨달으십시오. 두 번째 예를 변경하면 구문 적으로 선언 할 :

int a0=1,a1=2,a2=3; 

쉼표가 운영되지 않습니다, 그들은 단지 목록에 선언자의 인스턴스를 분리하는 데 필요한 구문 있습니다.

또한 매개 변수/인수 목록에 사용 된 쉼표는 쉼표 연산자가 아닙니다.

제 생각에는 쉼표 연산자는 거의 항상 나쁜 생각입니다. 단지 불필요한 혼란을 야기합니다. 대부분의 경우 쉼표 연산자를 사용하여 수행되는 작업은 별도의 명령문을 사용하여보다 명확하게 수행 할 수 있습니다.

쉽게 이해할 수있는 두 가지 예외는 for 문안의 제어 절 내부에 있고 두 개 이상의 'thing'을 하나의 표현식에 반드시 밀어 넣어야하는 매크로에 있으며 두 번째 예외가있을 때만 수행해야합니다 다른 적절한 옵션).

+0

여기에 구분 기호로 사용하는 경우에도 3 자리 배열을 선언하고 나에 따라 왼쪽에서 오른쪽으로 값을 할당해야합니다. –

+4

@fahad : 쉼표가 연산자가 아닌 경우에도 링크 된 페이지에 , "쉼표는 함수 인수 목록과 같은 일부 컨텍스트에서 구분 기호로 사용할 수 있습니다. 분리 기호로 쉼표를 사용하여 운영자로 혼동하지 마십시오. 두 가지 용도는 완전히 다릅니다." –

+0

오 죄송합니다. 당신이 내 사이에 잡았 주석 :) –

5

표현식이 나타날 수있는 곳이면 어디에서나 쉼표 연산자를 사용할 수 있습니다. 몇 가지 예외가 있습니다. 특히 쉼표 연산자는 상수 표현식에서 사용할 수 없습니다.

또한, 쉼표는 구분 기호로 사용되는 쉼표 연산자를 사용하여 함수를 호출 할 때, 예를 들어, 당신이 그룹에 쉼표 표현 괄호를 사용해야 할 때 조심해야

:

void f(int, bool); 

f(42, 32, true); // wrong 
f((42, 32), true); // right (if such a thing can be considered "right") 

귀하의 예를 선언입니다 :

int arr[3],arr[0]=1,arr[1]=2,arr[2]=3; 

선언에서, 당신은, 그래서 여기에 쉼표로 구분하여 여러 가지를 선언 할 수도 쉼표는 구분 기호로 사용됩니다. 또한, 이와 같은 선언의 끝 부분에 표현식을 붙일 수는 없습니다. (int arr[3] = { 1, 2, 3 };을 사용하여 원하는 결과를 얻을 수 있습니다.

+0

아마 괄호 연산자는 _expression_이 예상되는 곳에서 사용될 수 있지만, 많은 경우 사람들이 표현식을 사용한다고 자주 생각할 때 _assignment-expression_ 만 허용됩니다. 예 : 함수 인자, 초기화 자. –