C++ -- x, y를 반환한다; 요점이 무엇인가?
저는 몇 년 동안 C와 C++로 프로그래밍을 해왔고, 지금은 대학교 과정을 수강하고 있습니다. 저희 책은 예를 들어 다음과 같은 기능을 가지고 있습니다.
int foo(){
int x=0;
int y=20;
return x,y; //y is always returned
}
을 사용하다저는 한번도 본 요.,
매개 변수 목록 외부에서 사용되는 연산자. ify
하지만 항상 반환됩니다. 럼럼무 슨미 ?? ???이렇게 반품 명세서를 작성해야 하는 경우가 있습니까?
(또, C도 양쪽 모두에 해당하기 때문에 태그를 붙였습니다만, 제 책은 C++입니다.)
C FAQ에 따르면:
정확히 말하면, 일반식에서의 쉼표 연산자의 의미
e1, e2
는 "서브 표현식 e1을 수정한 후 e2를 평가합니다.이 식의 값은 e2의 값입니다"입니다.따라서 e1은 할당 또는 ++ 또는 감소 -- 또는 함수 호출 또는 기타 부작용을 수반하는 것이 좋습니다. 그렇지 않으면 폐기되는 값이 계산되기 때문입니다.
그래서 저는 당신의 의견에 동의합니다. 만약 그렇다면 이것이 유효한 구문이라는 것을 보여주는 것 외에는 의미가 없습니다.
또는 의을 반환하는 는, C++ 를 작성할 수 .struct
x
★★★★★★★★★★★★★★★★★」y
멤버 대신 구조물을 반환합니다.
struct point {int x; int y;};
유형 및하여 두 할 수 .struct
:
typedef struct point Point;
Point point(int xx, int yy){
Point p;
p.x = xx;
p.y = yy;
return p;
}
그런 다음 원래 코드를 변경하여 도우미 기능을 사용합니다.
Point foo(){
int x=0;
int y=20;
return point(x,y); // x and y are both returned
}
마지막으로 시험해 볼 수 있습니다.
Point p = foo();
printf("%d, %d\n", p.x, p.y);
C++라고 합니다.가 다음에하듯이 C에서는 C++의 Constructor를 할 수 point
보다 우아한 솔루션을 제공하는 구조입니다.
한편, Python과 같은 언어에서는 여러 값을 직접 반환할 수 있는 기능이 훌륭합니다.
def foo():
x = 0
y = 20
return x,y # Returns a tuple containing both x and y
>>> foo()
(0, 20)
파라미터 리스트의 콤마는 파라미터를 구분하기 위한 것으로 콤마 연산자와는 다릅니다.예시와 같이 쉼표 연산자는 x와 y를 모두 평가한 다음 x를 버립니다.
이 경우, 2개의 가치를 되돌리려 하고, 그것을 어떻게 해야 할지 몰랐던 사람의 실수라고 추측할 수 있습니다.
합니다.for
하다
for( int i=0, j=10; i<10; i++, j++ )
{
a[i] = b[j];
}
첫 번째 쉼표는 쉼표 연산자가 아니라 선언 구문의 일부입니다.두 번째는 쉼표 연산자입니다.
이것은 원래 질문에는 전혀 답하지 않지만, 일부 사람들에게는 관심이 있을 수 있습니다.그러나 양쪽을 C++로 되돌리려면 다음과 같이 기술해야 합니다(또한 c++0x 컴파일러가 필요합니다).
tuple<int, int> foo()
{
int x = 0;
int y = 20;
return make_tuple(x, y);
}
이렇게 접속하는 건...
tuple<int, int> data = foo();
int a = get<0>(data);
int b = get<1>(data);
struct Point {
int x, y;
Point(int x_) : x(x_), y(0) {}
Point(const Point& p) : x(p.x), y(p.y) {}
Point operator, (int y_) const { Point p=*this; p.y = y_; return p; }
};
Point get_the_point () {
int x = 0;
int y = 20;
return (Point)x, y;
}
:p
여기에 코멘트를 하고 있는 모든 사람이 이것이 무의미하다고 생각하는 것과 마찬가지로 저도 반대하지 않습니다.예를 들어, 예를 들면, 그다지 좋은 것은 아닌 것 같습니다.
라이터는 함수 내에서 x가 사용되지 않는 것에 대한 컴파일러 경고를 받고 있었고, 이는 경고를 없애기 위한 쉬운 방법이었다.
쉼표 연산자(,)입니다.
식 x와 y가 모두 평가됩니다.전체 표현의 결과는 y, 즉 후자의 값입니다.
왜 여기에 쓰였는지 말하기 어렵다.시연용으로요분명히 기능은 다음과 같이 리팩터링될 수 있습니다.
int foo()
{
return 20;
}
하면, 「」의 스코프 로 보존할 수 .if
. - 예: 일반적으로 다음과 같이 작성합니다.
if (someThing == true)
{
a = 1;
b = 2;
return true;
}
이것은 다음과 같이 대체할 수 있습니다.
if (someThing == true)
return a = 1, b = 2, true;
이 코딩 방식의 사용은 깨끗한 코드를 작성하기보다는 포즈를 취하려는 충동에 의한 것이라고 생각합니다.
코드의 끔찍한 예인 것 같네요C/C++에서는 유효한 구문일 수 있지만, 왜 그렇게 하고 싶은지 이유를 알 수 없습니다.
x와 y를 모두 반환하는 경우 C++에서 반환하는 더 좋은 방법은 x와 y 속성을 가진 "Point" 클래스 또는 구조를 정의하고 반환하는 것입니다.다른 옵션은 x와 y를 기준으로 전달한 다음 메서드에서 값을 적절하게 설정하는 것입니다.
메서드가 y만 반환하는 경우 y를 반환하면 됩니다.반환문 전에 x를 "평가"해야 하는 경우 별도의 행으로 수행해야 합니다.
그 반환문에는 의미가 없다.
ifx
를 받다volatile
( C는 C++를 하고 있기 에) volatile
변수는 외부에서 관찰할 수 있는 동작으로 간주되지만, 그렇지 않습니다.
, 「」이 아니고,x
계산 그 나서 「이러한 계산」을 되돌립니다그 계산을 하고 나서 돌아오면y
, 비단, 비(非)-volatile
x
부작용이 없습니다.부작용이나 외부에서 관찰할 수 있는 동작이 없는 코드를 실행하기 위해 구현이 필요하지 않습니다.쉼표 연산자는 쉼표 왼쪽에 있는 모든 항목을 실행하고 결과를 무시하며 오른쪽 값을 실행 및 유지합니다(이 경우 연산자의 왼쪽을 무시해도 됩니다).
때문에 '이러한'은return x, y;
은 '어느 때 보다'와.return y;
.x
가 없는으로 '어울러서', '어울러서', '어울러서', '어울러서', '어울러서'라고 것 .x; return y;
그렇게 혼란스럽진 않을 거야
한편으로는 작가의 솔직한 실수일 수도 있다.
한편, 라이터는 구문적으로 올바른 코드와 컴파일러의 경고를 설명하고 있을 가능성이 있습니다.
어느 쪽이든 여러 결과를 반환하는 유일한 방법은 클래스를 정의하고 해당 인스턴스 또는 배열 또는 컬렉션을 사용하는 것입니다.
표표연연 연다다다다다 변수 ""에 할 수 .x
.
루프의 경우 외부에서 이 Comman 연산자의 다른 주요 사용자(함수 호출 버전에 해당)는 몇 가지 작업을 수행한 후 값을 반환하는 매크로에 있습니다.지금은 다른 방법도 있지만 예전에는 Comman operator가 가장 깨끗했다고 생각합니다.
#define next(A, x, y, M) ((x) = (++(y))%(M) , A[(x)])
이 매크로는 x나 다른 이유로 반복되기 때문에 일반적으로 매크로의 나쁜 예입니다.이러한 방법으로 쉼표 연산자를 사용하는 경우는 드물 것입니다.이 책의 예는 아마도 그 예에서 사용할 수 있는 줄 수에 맞는 코드 검사를 만들기 위한 시도였을 것입니다.
이렇게 반품 명세서를 작성해야 하는 경우가 있습니까?
IMO, 나는 책 예시와 같은 함수에 다중 반환을 사용하지 않을 것이다.구조화 설계에 위배됩니다.그럼에도 불구하고, 많은 프로그래머들이 그렇게 한다!다른 사람의 코드를 디버깅하면서 각 리턴 스테이트먼트의 글로벌 변수에 값을 할당하여 어떤 리턴이 실행되었는지 알 수 있습니다.
C에서 작업 도중 복귀 시 하우스키핑에 사용되는 구문을 본 적이 있습니다.유지보수가 불가능한 코드:
int foo(int y){
char *x;
x = (char*)malloc(y+1);
/** operations */
if (y>100) return free(x),y;
/** operations */
if (y>1000) return free(x),y;
}
이 책은 C++ 이전에 다른 언어를 배운 사람들의 잠재적인 혼란을 없애기 위해 노력하고 있다.많은 언어에서 유사한 구문을 사용하여 여러 값을 반환할 수 있습니다.C++에서는 경고 없이 컴파일 됩니다(지정하지 않는 한).-Wall
★★★★★★★★★★★★★★★★★」-Wunused-value
다른 언어에 익숙하다면 예상대로 작동하지 않을 것입니다.마지막 값만 반환합니다.
그러나 C++의 리턴 스테이트먼트에 이러한 구문을 사용하는 것은 실수로 다른 언어처럼 사용하는 것 이외에는 읽을 수 없는 상황이기 때문에, 필자는 예방한 것보다 더 큰 혼란을 일으킨 것 같습니다.그는 대부분의 사람들이 시도하지 않을 사용법에 대해 경고하고 있다. 디버깅을 , 스테이트먼트 「Assignment Statement」가 「Assignment Statement」로 되어 있기 디버깅하는 은 매우 혼란스러울 입니다.복수의 할당문이int x, y = foo()
이치노
: " " " 를 사용합니다.-Wall
경고한 내용을 바로잡을 수 있습니다.C++ 구문을 사용하면 의미 없는 많은 내용을 쓸 수 있습니다.
return
키워드를 지정하면 쉼표 연산자는 마지막 값을 반환합니다.이 값은 처음에는 혼란스럽지만 더 간결해질 수 있습니다.
예를 들어, 다음 프로그램은 상태 코드 2로 종료됩니다.
#include <iostream>
using namespace std;
void a() {
cout << "a" << endl;
}
int one() {
cout << "one" << endl;
return 1;
}
int zero() {
cout << "zero" << endl;
return 0;
}
int main() {
return one(), a(), zero(), 2;
}
다음과 같이 컴파일하여 실행하면 다음과 같은 출력이 나타납니다.
michael$ g++ main.cpp -o main.out && ./main.out ; echo $?
one
a
zero
2
그래도 y가 항상 반환된다면 무슨 의미가 있을까요?
점은 x의 부작용(쉼표 연산자의 왼쪽)입니다.예를 들어,상세한 것에 대하여는 저스틴 에티어가 대답한다.
이렇게 반품 명세서를 작성해야 하는 경우가 있습니까?
예를 들어 C++14까지 C++11의 constexpr 함수의 경우: 이러한 함수는 임의의 스테이트먼트를 포함하지 않고 정확히1개의 리턴 스테이트먼트를 포함할 수 있습니다.
다음은 Patrice Roys의 CppCon 2016 코드 샘플입니다.
constexpr int integral_div(int num, int denom) {
return assert(denom != 0), num / denom;
}
언급URL : https://stackoverflow.com/questions/2539458/c-return-x-y-what-is-the-point
'programing' 카테고리의 다른 글
Vuetify css가 부트스트랩 css를 크래시하다 (0) | 2022.06.04 |
---|---|
모듈의 공유 상태 액션을 사용한 Vuex 4 + Vue 3 (0) | 2022.06.04 |
Python에서 C코드를 사용할 수 있나요? (0) | 2022.06.04 |
sprintf 버퍼 크기 결정 - 표준 규격은 무엇입니까? (0) | 2022.06.03 |
css 파일을 인라인 파일이 아닌 .css 파일로 출력하는 방법css 파일을 인라인 파일이 아닌 .css 파일로 출력하는 방법 (0) | 2022.06.03 |