programing

C의 for(;;) 루프에서 여러 변수를 선언하려면 어떻게 해야 합니까?

newstyles 2023. 6. 18. 12:26

C의 for(;;) 루프에서 여러 변수를 선언하려면 어떻게 해야 합니까?

나는 하나가 몇 가지 변수를 선언할 수 있다고 생각했습니다.for루프:

for (int i = 0, char* ptr = bam; i < 10; i++) { ... }

하지만 저는 이것이 불가능하다는 것을 방금 알았습니다.GCC에서 다음 오류가 발생합니다.

오류: 'char' 앞에 정규화되지 않은 ID가 필요합니다.

다른 유형의 변수를 선언할 수 없다는 것이 정말 사실입니까?for루프?

로컬 구조체 유형을 사용할 수 있지만 일반적으로 사용해서는 안 됩니다.

for ( struct { int i; char* ptr; } loopy = { 0, bam };
      loopy.i < 10 && * loopy.ptr != 0;
      ++ loopy.i, ++ loopy.ptr )
    { ... }

C++11부터는 로컬 변수에 의존하지 않는 한 개별 부품을 보다 우아하게 초기화할 수 있습니다.

for ( struct { int i = 0; std::string status; } loop;
      loop.status != "done"; ++ loop.i )
    { ... }

이것은 실제로 사용하기에 충분히 읽을 수 있습니다.


C++17은 구조화된 바인딩 문제를 해결합니다.

using namespace std::literals::string_literals;

for ( auto [ i, status ] = std::tuple{ 0, ""s }; status != "done"; ++ i )

다른 유형의 선언자를 동시에 선언하고 초기화할 수 없는 것은 사실입니다.하지만 이것은 루프에만 국한된 것이 아닙니다.다음 작업을 수행하면 오류가 발생합니다.

int i = 0, char *ptr = bam;

for 루프의 첫 번째 절은 (C99 § 6.8.5.3) "선언" 또는 "보이드 식"일 수 있습니다.다음 작업을 수행할 수 있습니다.

int i = 0, *j = NULL;
for(int i = 0, *j = NULL;;){}

왜냐면i그리고.*j둘 다 유형입니다.int선언문의 정확한 구문은 §6.7에 제시되어 있습니다.

만약 당신이 루프의 범위에 머무르기 위해 변수가 정말로 필요하다면 당신은 쓸 수 있습니다.

{ char* ptr = bam; for (int i = 0; i < 10; i++) { ... } }

좀 못생겼지만 효과가 있습니다.

사용해 보십시오.

int i;
char* ptr;
for (i = 0, ptr = bam; i < 10; i++) { ... }

다음 작업도 수행할 수 있습니다.

for (int i = 0; i < 10; i++) {
    static char* ptr = bam;
}

http://linuxsoftware.co.nz/cppgrammar.html#for-init-statement 에 따르면 for-init 문에서 간단한 선언이나 표현식(선언을 포함할 수 없음)만 얻을 수 있습니다.그것은 답이 "아니오"라는 것을 의미합니다(제가 BNF를 정확하게 분석했다면 :).

요즘 그들이 아이들에게 가르치는 언어는 여러분에게 수갑을 채우고 여러분의 뇌를 썩게 하기 위한 것이라고 생각합니다. 그래서 여러분은 조용히 하고 레고 블록들을 아주 제한된 형태로 조립해서 평범한 것들을 만들 수 있습니다.C의 장점은 규칙을 따르고, 현명한 방법으로 원하는 것을 얻을 수 있다는 것입니다.추가 이니셜라이저를 사용하여 루프를 작성하는 방법은 다음과 같습니다.다음은 확장 루프를 첫 번째 루프에 브리지하는 방법을 보여주는 작업 예제입니다.첫 번째 변수를 사용하여 변수를 해적질하고 범위를 유지합니다.더미 변수를 사용하여 외부 루프를 한 번 실행할 수 있습니다.스마트 컴파일러는 사실을 기록하고 루프 언롤러로 루프를 핵으로 처리합니다.그래서 당신에게 그것은 단지 이익일 뿐입니다.그런 다음 두 번째 배열은 첫 번째 선언과 두 번째 선언의 일부 변수를 사용하고 완료될 때까지 실행됩니다.이것은 단지 당신이 어떤 범위 내에서 던지는 무거운 손놀림 없이 그것을 하는 방법을 이해할 수 있다는 것을 의미하는 사소한 예입니다.왜냐하면 이 기술은 이렇게 쓸 때 매크로와 함께 사용될 수 있기 때문입니다. 제가 가지고 있는 "array do의 값을 위해"와 같은 아름다운 차세대 구조 열거를 만들 수 있습니다.

#include "stdio.h"
int
main(int argc, char **argv)
{
    const int max=7;
    const char *array[7] = {
    "hello","you","kids","who","don't","know","malloc\n"
    };

    for(int i=0,count=max,$=1;$;$=0)
    for(const char **p=array;count<max;i++)
    {
        printf("%s ",p[i]);
    }
}

여기에는 빠진 것이 하나도 없습니다.루프를 위해 원 샷과 루프 결합하는 이 기술은 이 해시 개체에 대한 열거자를 가져오기 위한 호출에 내장하고 열거를 시작하여 키와 값에 대해 추출된 값을 가져오기 위해 사용되고, 또한 편리하게 사용자를 위한 빈 포인터로 만들기 위해 사용됩니다.그런 다음 키와 값이 모두 채워질 때까지 열거형이 계속됩니다.사용자가 반복 중에 중단하면 루프에 대한 한 샷의 전체 캐스케이드가 우리가 원하는 대로 무너질 것입니다. 왜냐하면 컴파일러가 볼 수 있는 단순한 코퍼스로 구성되었기 때문에 루프가 해제되기 때문입니다.따라서 기본적으로 구문을 확장하여 이러한 작업을 처벌 없이 수행할 수 있습니다.

하지만 여러분은 C에 대해 조금 알고, 적어도 요즘 학교들이 이런 장난감 언어들을 가지고 그들을 투입하고 있는 로봇 박스에서 머리를 빼내야 합니다.

언급URL : https://stackoverflow.com/questions/3348766/how-do-i-declare-several-variables-in-a-for-loop-in-c