programing

만약(x=0)이면 C에서 무엇을 의미합니까?

topblog 2023. 11. 4. 09:48
반응형

만약(x=0)이면 C에서 무엇을 의미합니까?

그래서 gcc/C에서 컴파일러는 다음과 같이 컴파일합니다.

if ((x=0)){ some code }

가 사용되는 반면

if (x=0){ some code }

를 사용하면 컴파일러가 컴파일을 거부합니다.

둘의 차이점은 무엇입니까?

참고로, 나는 어떤 점이 다른지 압니다.x==0그리고.x=0. 나는 단지 C가 어떤 이상한 코드를 만났을 때 어떻게 행동하는지 탐구하고 있을 뿐입니다.

코드별로 차이가 없습니다.

지금 일어나고 있는 모든 일은 그 말이x=0대신에x==0대부분의 컴파일러가 오류를 볼 때 경고(또는 오류)를 표시할 정도로 일반적인 오류입니다.괄호의 추가 집합은 컴파일러를 닫게 하는 일반적인 속임수입니다. 예, 저는 정말로 이것을 하려고 했습니다.라고 말하는 것과 같습니다.

둘 다 구문론적으로 정확한 C이고 컴파일러가 대처해야 합니다.그러나 컴파일러는 구성에 따라 경고 또는 오류(예: -gcc의 오류)를 발생시킬 수 있습니다. 그 중 하나가 너무 의심스러워서 결코 의도적이라고 예상할 수 없기 때문입니다.당신이 어떤 것을 사용할때는.if (x = 0) { ... }(0을 assign합니다.x그리고 0이 0이 아닌 경우 블록을 실행합니다), 당신은 거의 항상 실제로 의미합니다.if (x == 0) { ... }(블록 실행:x0)입니다.

이제 그 이유를 알아보겠습니다.if ((x = 0)) { ... }동일한 유형의 경고를 보증할 정도로 의심스러운 것으로 간주되지 않습니다(이 특정 코드는 항상 0으로 평가되며 차체가 실행되지 않기 때문에 여전히 의심됩니다).

몇몇 C 개발자들이 사용하는 관용구가 있는데(저도 그중 하나입니다), 과제를 괄호 안에 넣고 과제도 가치 자체가 있고 그것이 할당된 가치라는 특징을 활용하는 것입니다.

예:

#include <stdio.h>

int main(int argc, char **argv)
{
    int c;

    while ((c = getchar()) != '\n')
            printf("Character: '%c' (0x%02x)\n", c, c);

    return 0;
}

예제를 테스트합니다.

$ ./test
Hello!
Character: 'H' (0x48)
Character: 'e' (0x65)
Character: 'l' (0x6c)
Character: 'l' (0x6c)
Character: 'o' (0x6f)
Character: '!' (0x21)

중요한 부분은 상태였습니다.(c = getchar()) != '\n'여기서 먼저 결과를 할당합니다.getchar()로.c특정 값을 확인합니다.바로 이 경우에 우리는 표준 입력에서 한 줄과 한 줄의 문자를 하나씩 읽고 있습니다(기술적으로는 a를 읽을 때까지).\n성격).이런 방식으로 하는 것의 가장 큰 장점은 그것이 당신이 그것을 채울 수 있게 해준다는 것입니다.getchar()시험에 들어갔습니다.그렇지 않으면 공백이 있는 무한 루프인 쉼표 표기법을 사용하거나 루프 앞과 루프 끝에 모두 놓아야 합니다.

0이 아닌 값과 비교하는 경우가 있습니다.\n,-1그리고 비슷하지만 때로는 0과 비교하거나 포인터를 사용할 때 다음과 같은 경우가 있습니다.NULL. 에 대한 예를 찾아보겠습니다.NULL, 메모리 할당에 상당히 일반적인 일입니다.

char *p;

if ((p = malloc(50)) == NULL) {
    ...handle error...
}

물론 다음과 같이 쓸 수 있습니다.

char *p;

p = malloc(50);
if (p == NULL) {
    ...handle error...
}

그러나 취향에 따라 다음을 사용할 수도 있습니다.

char *p;

if (!(p = malloc(50))) {
    ...handle error...
}

또는 반대로 돌려도 됩니다.(그런데 오류 사례를 항상 먼저 처리하는 제 선호 방식과 반대됩니다.)

char *p;

if ((p = malloc(50))) {
    ...do stuff...
} else {
    ...handle error...
}

마지막의 경우, 조건은(p = malloc(50))정확히 다음과 같은 것입니다.p = malloc(50)그러나 후자는 C언어와 파생언어의 비교 대신에 과제를 수행하는 이미 언급된 흔한 실수 때문에 매우 의심스럽습니다.이것은 의심스러운 컴파일러뿐만 아니라 사람들이 코드를 읽고 잠재적인 오류를 보는 것에 관한 것입니다.

중복 괄호는 단순히 독자들과 컴파일러들에게 이 과제가 분명히 의도적인 것이며 그 흔한 버그의 발생이 아니라는 것을 알려주는 수단일 뿐입니다.

코드가 컴파일을 "거부"하면 안 됩니다.-Werror. 경고를 사용하도록 설정한 경우 다음을 알려줄 수 있습니다.

warning: 진리값으로 사용되는 할당 주변 괄호 제시 [-W 괄호]while (*dest++ = *src++)

구체적으로 GCC 문서는 경고의 목적에 대해 다음과 같이 말합니다.

진리값이 예상되는 상황에서 할당이 있을 때 또는 사용자가 자주 혼동하는 연산자가 중첩될 때와 같이 특정 맥락에서 괄호가 생략될 경우 경고합니다.

언급URL : https://stackoverflow.com/questions/25960571/what-does-ifx-0-mean-in-c

반응형