C ++를 사용하여 한 줄에 여러 변수를 선언하고 정의하려면 어떻게해야합니까?


173

나는 항상이 세 가지 변수를 선언하면 모두 0 값을 갖습니다.

int column, row, index = 0;

그러나 인덱스 만 0이고 다른 것은 844553 및 2423445와 같은 정크입니다.

각 변수를 새 줄에 선언하지 않고 이러한 변수를 모두 0으로 초기화하려면 어떻게해야합니까?


36
한 줄의 다중 변수 선언에주의하십시오. int 포인터를 선언하고 일반 정수 목록을 선언하는 것보다 쉽습니다 int* a, b, c;.
Chris Eberle

4
=0정의에 각 변수 에 대해 쓰는 변수는 세 가지뿐입니다 . 그리고 실제로 많은 변수를 원한다면 배열을 시도 하십시오. int a[10]={0}각각 a[i]0을 초기화 합니다.
Stan

컴파일러는 합리적인 프로그래머가 기대하는 것과 다르게 동작 할 경우 해당 구문을 허용해서는 안됩니다 ... imho
cph2117

1
@ cph2117 합리적인 프로그래머는 ``이 문법은 문법이 어떻게 바인딩되는지에 따라 몇 가지 다른 것을 의미 할 것 '' 이라고 생각 하고, 표준을 찾아서 어느 것이 참인지 알아 내고, 그것에 착수합니다.
underscore_d

그만해 코드를 읽기 어렵게 만듭니다. 고급 언어로 코드를 작성하는 요점은 관리자가 쉽게 읽을 수 있도록하는 것입니다.
마틴 요크

답변:



162

선언 할 때 :

int column, row, index = 0;

인덱스 만 0으로 설정됩니다.

그러나 다음을 수행 할 수 있습니다.

int column, row, index;
column = index = row = 0;

그러나 개인적으로 나는 지적 된 다음을 선호합니다.
내 견해로는 더 읽기 쉬운 형태입니다.

int column = 0, row = 0, index = 0;

또는

int column = 0;
int row = 0;
int index = 0;

3
마지막 두 값 사이에서 나는 두 값이 실제로 같은 유형이어야하는지 ( bool previousInputValue, presentInputValue;) 아니면 지금 같은 유형 uint8_t height, width;일지 모르지만 실제로는 필요하지는 않습니다 ( uint8_t height; uint16_t width;미래에 나올 수 있고 있어야 했음) uint8_t height; uint8_t width;우선 첫째로).
altendky 2016 년

미래에 쓰는 uint8_t height; uint16_t width;대신 uint8_t height, width;10 글자 를 절약 할 수 있기 때문 입니다. :-) 물론 원하는대로 할 수 있습니다. 쉽게 읽을 수 있도록하십시오. 마지막 양식이 가장 명확합니다.
Matt

마지막 형식은 각 변수의 유형을 명시하고 각 변수가 초기화되었음을 명확하게하는 가장 분명한 형태입니다. 즉, 열과 행이 동일한 유형이 될지 여부는 명확하지 않습니다. 아마도 우리는의 명시 성을 선호 int presentValue = 0; typeof(presentValue) previousValue = presentValue;하지만 typeof()비표준 GCC 확장 이라고 생각합니다 .
altendky

49

@Josh가 말했듯이 정답은 다음과 같습니다.

int column = 0,
    row = 0,
    index = 0;

포인터로 같은 것을 조심해야합니다. 이:

int* a, b, c;

다음과 같습니다.

int *a;
int b;
int c;

34
나는 그 포인터가 싫다. 별표는 유형의 일부이므로 모든 별표에 적용해야합니다. 상상해 unsigned long x, y;선언 x으로 unsigned long하지만, y같은 단지 unsigned, 일명 unsigned int! 정확히 동일합니다! </ rant>
캠 잭슨

6
말이 되는군요. "int * a, b, c;"
Jeroen

7
@JeroenBollen 글쎄, 타입 대신 변수 이름 옆에 포인터 별표를 쓰면 의미가 있지만 그 자체로는 의미가 없습니다. 위에서 말했듯이 별표는 이름의 일부가 아닌 유형의 일부이므로 유형별로 그룹화해야합니다!
Cam Jackson

11
측면이 아니라면, 실제로는 * int *a*a나타내는 수단 으로 *가 반드시 유형의 일부가 아니라는 의미가 있습니다 .int 값 .
mdenton8

2
요점은 이미 만들어졌지만 void에 추가하는 것은 본질적으로 유형이 없지만 여전히 포인터를 만들 수 있습니다. 따라서 왜 void* a컴파일되고void *a, b, c 되지 않습니다. 이 합리화는 저에게 효과적입니다.
Josh C

25

한 줄에 하나의 변수 / 객체를 선언하면이 문제를 해결할뿐만 아니라 포인터를 선언 할 때 코드를 더 명확하게하고 어리석은 실수를 방지합니다.

그러나 질문에 직접 대답하려면 각 변수를 0으로 명시 적으로 초기화해야합니다. int a = 0, b = 0, c = 0;.


16
int column(0), row(0), index(0);

이 형식은 특히 생성자가 둘 이상의 인수를 사용할 때 사용자 정의 유형에서도 작동합니다.


2
현재는 균일 한 초기화 (C ++ 17로 고정하여 auto...) : int column { 0 } , row { 0 } , index { 0 } ;
underscore_d

5

2k18부터는 구조적 바인딩을 사용할 수 있습니다 .

#include <iostream>
#include <tuple>

int main () 
{
    auto [hello, world] = std::make_tuple("Hello ", "world!");
    std::cout << hello << world << std::endl;
    return 0;
}

Demo


4

가능한 접근법 :

  • 모든 지역 변수를 0으로 초기화하십시오.
  • 배열 memset또는 {0}배열이 있습니다.
  • 전역 또는 정적으로 만듭니다.
  • 를 넣어 struct, 그리고 memset제로로 초기화 할 생성자를 가지고있다.

#define COLUMN 0 #define ROW 1 #define INDEX 2 #define AR_SIZE 3 int 데이터 [ AR_SIZE ]; // 단지 아이디어.
Ajay

죄송합니다. 왜 응답에 " 배열, 배열 또는 {0} 배열 "을 포함 시켰 습니까?
Mateen Ulhaq

memset (데이터, 0, sizeof (데이터)); // 논리적으로 묶을 수있는 경우.
Ajay

2

나는 이것을 권장하지 않지만 실제로 한 줄이되고 한 번만 0을 쓰는 경우 다음을 수행 할 수도 있습니다.

int row, column, index = row = column = 0;

0

다른 사람들이 언급했듯이 C ++ 17부터 여러 변수 할당 에 구조적 바인딩 을 사용할 수 있습니다 .

이것을 결합 std::array템플릿 인수 공제하는 것은 우리가 기능을 쓸 수 있습니다 할당 한 변수의 임의의 수에 값 유형이나 값을 반복하지 않고 .

#include <iostream>
#include <array>

template <int N, typename T> auto assign(T value)
{
    std::array<T, N> out;
    out.fill(value);
    return out;
}

int main()
{
    auto [a, b, c] = assign<3>(1);

    for (const auto& v : {a, b, c})
    {
        std::cout << v << std::endl;
    }

    return 0;
}

Demo


-13

변수를 초기화하지 않고 선언하면 메모리에서 임의의 숫자가 선택되고 변수가 해당 값으로 초기화됩니다.


7
실제로는 아닙니다. 컴파일러는 '이 변수는 주소 xxx에있을 것입니다'를 결정합니다. 주소 xxx에 발생한 모든 것이 명시 적으로 (초기화 또는 할당에 의해) 설정되지 않는 한 초기 값이됩니다
pm100

3
@ pm100은 더 나아 지고 사용자를 괴롭히지 않는 사소한 구현의 경우 true입니다. 초기화되지 않은 변수를 사용하는 것이 여전히 UB이므로 ;-) 과도하게 단순화되어 있습니다 . 아무것도 코드를 포함하여, 발생할 수 그 변수를 단순히 프로그램에서 제거하는 것-최적화가 진행 중일 때 특히 그렇습니다.
underscore_d

1
해당 변수의 값은 주소에 있던 값, 즉 정크입니다.
페드로 베르네 티

@PedroVernetti 새로운 변수가 선언되고 같은 주소를 얻기 전에 해당 주소에 무슨 일이 있었는지는 중요하지 않습니다. 사용자가 값으로 초기화하지 않고 새 변수를 선언 한 다음 값을 할당하기 전에 변수를 읽으면 프로그램에 정의되지 않은 동작이있는 것입니다. 그것은 "무작위"와 "정크"보다 무한히 나빠서 피해야합니다.
underscore_d
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.