sourcetip

쉼표 연산자의 역할은 무엇입니까?

fileupload 2023. 7. 22. 10:20
반응형

쉼표 연산자의 역할은 무엇입니까?

다음 코드는 C/C++에서 무엇을 합니까?

if (blah(), 5) {
    //do something
}

쉼표 연산자가 적용되고 값 5가 조건의 참/거짓을 결정하는 데 사용됩니다.

blah()를 실행하고 무엇인가를 반환한 다음(아마도) 쉼표 연산자가 사용되고 5만 식의 참/거짓 값을 결정하는 데 사용됩니다.


blah() 함수의 반환 유형(지정되지 않음)에 대해 , 연산자가 오버로드되어 결과가 분명하지 않을 수 있습니다.

쉼표 연산자가 오버로드되지 않은 경우 코드는 다음과 유사합니다.

blah();
if (5) {
  // do something
}

쉼표 연산자가 오버로드된 경우 결과는 해당 함수를 기반으로 합니다.

#include <iostream>
#include <string>

using namespace std;

string blah()
{
    return "blah";
}

bool operator,(const string& key, const int& val) {
    return false;
}

int main (int argc, char * const argv[]) {

    if (blah(), 5) {
        cout << "if block";
    } else {
        cout << "else block";
    }

    return 0;
}

(콤마 연산자 오버로드 시나리오를 표시하는 데 사용됩니다.이것에 대해 논평해 준 데이비드 피에르에게 감사합니다)

저는 이런 종류의 코드가 해야 할 한 가지 일을 알고 있습니다. 코드를 작동시켜야 한다는 것입니다.이렇게 글을 쓰는 사람 옆에서 일하는 것이 상당히 두려울 것 같습니다.

병리학적인 경우에는 쉼표 연산자가 수행하는 작업에 따라 다릅니다.

class PlaceHolder
{
};

PlaceHolder Blah() { return PlaceHolder(); }

bool operator,(PlaceHolder, int) { return false; }

if (Blah(), 5)
{
    cout << "This will never run.";
}

저는 그것이 blah()에 달려있다고 말하고 싶습니다.

좀 더 넓은 대답으로.쉼표 연산자(오버로드되지 않음)는 in과 같이 해결되고 첫 번째 부분을 실행한 후 두 번째 부분을 반환합니다.

따라서 (foo(), bar()가 있으면 두 함수가 모두 실행되지만 식의 값은 bar()(그리고 식의 유형)으로 평가됩니다.

그것에 대한 공정한 사용법이 있다고 말하지는 않겠지만, 보통은 코드를 읽는 것이 조금 어렵다고 여겨집니다.주로 이러한 구조를 공유하는 언어가 많지 않기 때문입니다.따라서 개인적인 경험상 기존 식에 코드를 추가하지 않고 형식을 완전히 변경하고 싶지 않은 경우에는 사용하지 않습니다.

예:나는 매크로가 있습니다(매크로를 사용해야 하는지 여부에 대해 논의하지 않고, 때로는 매크로를 작성한 사람도 아닙니다).

FIND_SOMETHINE(X) (x>2) ? FIND_과일(x) : FIND_houses(x)

그리고 주로 my_supsion = FIND_SOMETING (34)과 같은 과제에 사용합니다;

이제 디버그 목적으로 로그를 추가하고 싶지만 찾기 기능을 변경할 수 없습니다.할 수 있어요.

FIND_SOMETHINE(X)(x>2)? (LOG("과일을 찾습니다"), FIND_과일(x):(LOG("집을 찾습니다"), FIND_house(x)

저는 디버깅 목적으로 가끔 이런 구조를 사용합니다.blah의 반환값과 상관없이 if close를 true로 강제할 때.생산 코드에 절대로 표시되어서는 안 된다는 것은 명백합니다.

C 파일 또는 C++ 파일의 C 블록 내에서 C 코드라고 가정하여 다음과 같이 작성되었습니다.

그것은 무의미한 일입니다.blah()를 호출하지만 blah()의 결과는 전혀 고려되지 않습니다.고려되는 유일한 것은 5이므로 if는 항상 true로 평가됩니다.IOW 당신은 이 코드를 다음과 같이 쓸 수 있습니다.

blah();
// do something

아무 일도 없이

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

반응형