programing

콤마 연산자의 역할은 무엇입니까?

shortcode 2022. 8. 30. 22:44
반응형

콤마 연산자의 역할은 무엇입니까?

「 」가 죠?,★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★?

표현:

(expression1,  expression2)

먼저 식1을 평가하고 식2를 평가하여 식 전체에 대해 식2의 값을 반환한다.

에서 가장 많이 사용된 것은while 삭제:

string s;
while(read_string(s), s.len() > 5)
{
   //do something
}

수술을 한 후 부작용에 따라 검사를 합니다.다른 방법은 다음과 같습니다.

string s;
read_string(s);
while(s.len() > 5)
{
   //do something
   read_string(s);
}

쉼표 연산자는 왼쪽 피연산자를 평가하고 결과를 폐기한 다음 오른쪽 피연산자를 평가합니다. 그러면 결과가 됩니다.링크에 기재되어 있는 관용적인 사용은 에서 사용되는 변수를 초기화하는 경우입니다.for하다

void rev(char *s, size_t len)
{
  char *first;
  for ( first = s, s += len - 1; s >= first; --s)
      /*^^^^^^^^^^^^^^^^^^^^^^^*/ 
      putchar(*s);
}

그렇지 않으면 콤마 연산자를 많이 사용할 수 없지만 읽기 및 유지보수가 어려운 코드를 생성하기가 쉽습니다.

초안 C99 표준에서 문법은 다음과 같다.

expression:
  assignment-expression
  expression , assignment-expression

2항은 다음과 같습니다.

쉼표 연산자의 왼쪽 피연산자는 void 식으로서 평가됩니다.평가 후에 시퀀스 포인트가 있습니다.그런 다음 오른쪽 피연산자가 평가됩니다. 결과에는 피연산자의 유형과 값이 포함됩니다.97) 쉼표 연산자의 결과를 수정하거나 다음 시퀀스 포인트 이후에 액세스하려고 하면 동작은 정의되지 않습니다.

각주 97에는 다음과 같이 기술되어 있다.

쉼표 연산자는 l 값을 산출하지 않습니다.

, 쉼표 연산자의 결과에 할당할 수 없습니다.

콤마 연산자의 우선순위가 가장 낮기 때문에 를 사용하는 경우가 있습니다.()는 큰 차이를 만들 수 있습니다.다음은 다음과 같습니다.

#include <stdio.h>

int main()
{
    int x, y ;

    x = 1, 2 ;
    y = (3,4) ;

    printf( "%d %d\n", x, y ) ;
}

에는 다음과 같은 출력이 있습니다.

1 4

쉼표 연산자는 양쪽 식을 하나로 결합하여 양쪽 식을 왼쪽에서 오른쪽으로 평가합니다.오른쪽 값은 식 전체의 값으로 반환됩니다. (expr1, expr2)~와 { expr1; expr2; } 그 될 것 같아요.expr2함수 호출 또는 할당에서 사용됩니다.

볼 수 for다음과 같은 여러 변수를 초기화 또는 유지관리하기 위한 루프입니다.

for (low = 0, high = MAXSIZE; low < high; low = newlow, high = newhigh)
{
    /* do something with low and high and put new values
       in newlow and newhigh */
}

이것과는 별도로, 나는 항상 매크로로 함께 진행되어야 하는 두 가지 작업을 마무리할 때 "분노해서" 사용한 적이 있다.다양한 바이너리 값을 네트워크상에서 송신하기 위해서 바이트 버퍼에 카피하는 코드와 포인터가 유지되고 있었습니다.

unsigned char outbuff[BUFFSIZE];
unsigned char *ptr = outbuff;

*ptr++ = first_byte_value;
*ptr++ = second_byte_value;

send_buff(outbuff, (int)(ptr - outbuff));

서 값은 " " " 입니다.short ""int하다

*((short *)ptr)++ = short_value;
*((int *)ptr)++ = int_value;

에 우리는 C가 되었습니다. C는 유효하지 않기 때문입니다. 왜냐하면(short *)ptr그 당시 컴파일러는 개의치 않았지만 더 이상 l-값이 아니기 때문에 증분할 수 없습니다.을 두.

*(short *)ptr = short_value;
ptr += sizeof(short);

그러나 이 접근방식은 모든 개발자가 항상 두 가지 문구를 모두 포함해야 한다는 것을 기억해야 했습니다.출력 포인터, 값 및 값의 유형을 전달할 수 있는 기능을 원했습니다.템플릿에서는 C++가 아닌 C이기 때문에 함수를 임의의 타입으로 할 수 없기 때문에 매크로로 결정했습니다.

#define ASSIGN_INCR(p, val, type)  ((*((type) *)(p) = (val)), (p) += sizeof(type))

쉼표 연산자를 사용하여 표현식 또는 원하는 문장으로 사용할 수 있습니다.

if (need_to_output_short)
    ASSIGN_INCR(ptr, short_value, short);

latest_pos = ASSIGN_INCR(ptr, int_value, int);

send_buff(outbuff, (int)(ASSIGN_INCR(ptr, last_value, int) - outbuff));

이 예시들 중 어느 것도 좋은 스타일이 아니라고 말하는 것은 아닙니다!실제로 Steve McConnell의 Code Complete는 콤마 연산자를 사용하지 말라고 조언한 것으로 기억합니다.for.루프 은 1개의 변수입니다.for회선 자체에는 루프 제어 코드만 포함되어 있어야 하며, 다른 추가 비트의 초기화 또는 루프 유지보수는 포함되지 않습니다.

이것은 복수의 스테이트먼트를 평가하지만, 결과값(rvalue, 내 생각에)으로 마지막 1개만 사용합니다.

그래서...

int f() { return 7; }
int g() { return 8; }

int x = (printf("assigning x"), f(), g() );

x가 8로 설정됩니다.

앞의 답변에서 설명한 바와 같이 모든 문장을 평가하지만 마지막 문장을 식의 값으로 사용합니다.개인적으로는 루프 표현에서만 유용하다고 생각합니다.

for (tmp=0, i = MAX; i > 0; i--)

이 기능이 유용한 유일한 장소는 하나의 표현(아마도 init 표현 또는 루프 표현)으로 여러 작업을 수행하는 펑키루프를 작성하는 경우입니다.예를 들어 다음과 같습니다.

bool arraysAreMirrored(int a1[], int a2[], size_t size)
{
  size_t i1, i2;
  for(i1 = 0, i2 = size - 1; i1 < size; i1++, i2--)
  {
    if(a1[i1] != a2[i2])
    {
      return false;
    }
  }

  return true;
}

구문 오류가 있거나 엄밀한 C가 아닌 것을 섞어서 죄송합니다.오퍼레이터가 좋은 형태라고 주장하는 것은 아니지만, 그것 때문에 사용할 수 있습니다. 나는 아마 의의, 는도 a 할 것이다.while대신 init과 loop의 여러 식을 보다 명확하게 할 수 있도록 루프합니다.(그리고 선언하고 초기화하지 않고 i1과 i2를 인라인으로 초기화합니다... blah blah blah blah )

@Rajesh와 @Jeff Mercado의 질문에 대처하기 위해 부활하는 것입니다.이것은 검색엔진 히트작 중 하나이기 때문에 매우 중요하다고 생각합니다.

다음 코드 조각을 예로 들어 보겠습니다.

int i = (5,4,3,2,1);
int j;
j = 5,4,3,2,1;
printf("%d %d\n", i , j);

인쇄됩니다.

1 5

i케이스는 대부분의 답변에 따라 처리됩니다.모든 식은 왼쪽에서 오른쪽 순서로 평가되지만 마지막 식만 할당됩니다.i( 표현)is 1피트, 1피트 1인치

j는 상이한 을 따른다.,연산자 우선순위가 가장 낮습니다.이러한 규칙 때문에 컴파일러는 할당-표현, 상수, 상수...를 봅니다.표현은 다시 왼쪽에서 오른쪽 순서로 평가되며 그 부작용은 계속 보입니다.j5j = 5.

도 ★★★★★★★★★★★★★★★★★.int j = 5,4,3,2,1;는 언어 사양에서 허용되지 않습니다.이니셜라이저할당-표현식을 기대하기 때문에 direct는,이치노

이게 도움이 됐으면 좋겠다.

언급URL : https://stackoverflow.com/questions/52550/what-does-the-comma-operator-do

반응형