2014-02-24 3 views
2
#include<iostream> 
#include<iomanip> 
#include <math.h> 


using namespace std; 

int doIt(int a){ 
    a=a/1000; 
    return a; 
} 

void main(){ 
    int myfav= 23412; 
    cout<<"test: "+doIt(myfav); 
    cin.get(); 
} 

나는 왜 이것을 인쇄하지 않는지 궁금합니다. 미리 감사드립니다. cout에 대한 출력이 없습니까?

+1

'int main'이어야합니다. 있는 그대로 컴파일해서는 안되며 결과물을 설명하지 않습니다. – chris

+2

@chris 대부분의 컴파일러는'int main'을 항상 0을 반환하는 것을 의미하는'void main'을 취할 것입니다. 그 해석에 대해 어딘가에 스펙에 뭔가가있을 수도 있습니다. – ssube

+0

@ssube, GCC도 Clang도 가져 가지 않으며 MSVC도 사용합니다 (OP 용으로 컴파일 된 경우 최신 버전 일 수도 있음). 그리고 나는 그것이 허용되지 않는다고 확신합니다. 표준에서는 명시 적으로'int'를 반환해야한다고 명시하고 있습니다. 내가 알고있는 유일한 컴파일러는 TurboC++입니다. – chris

답변

2

C++ 스트림을 사용하면 +을 함께 사용하는 대신 cout << "test: " << doIt(myfav)을 사용해야합니다. << 또는 +이 우선하든 상관 없지만 스트림이나 문자열 리터럴에 추가하든 상관없이 잘 작동하지는 않습니다.

+0

고마워, C에서 코딩하는 동안 자바에서 생각했다 + +, 아마 한 번에 하나씩 배워야한다. – user3348907

2

void main()main 함수의 유효한 서명이 아닙니다 (VS가 인식 할 수는 있지만 표준을 준수하지 않습니다). int main()이어야합니다.

+을 사용하면 정수를 문자열에 삽입 할 수 없습니다. std::ostream : operator<<의 추출 연산자를 사용해야합니다. 가지고있는 것은 포인터 연산입니다 (doIt의 결과를 const char*의 주소에 추가하는 것은 정의되지 않은 동작입니다).

std::cout은 버퍼링 된 출력 스트림입니다. 버퍼를 플러시하지 않기 때문에, (콘솔이 닫히기 전에) 출력을 볼 수 있기 전에 프로그램이 끝날 확률이 있습니다. 모두

std::cout << "test: " << doIt(myFav) << std::endl; // flush the buffer with a newline 

또는

std::cout << "test: " << doIt(myFav) << std::flush; // flush the buffer 

모든, 당신은 무엇을 컴파일하지만, 전혀, 사용자가 원하는 일을 할 수 없습니다 : 다음 중 하나에 출력 라인을 변경합니다.

+1

시스템은 * 정상적으로 종료되는 한 프로그램 종료시 버퍼를 플러시해야합니다. – ssube

+0

사실'std :: cout'의 소멸자는'flush'를 호출합니다. – chris

+0

@ssube 현재 코드가 컴파일되지 않을 것이라는 점을 감안할 때 가장 걱정거리는 아닙니다. IIRC, VS2010과 함께 제공되는 표준 라이브러리 버전은 소멸자에서'std :: ostream'에 대한 버퍼를 플러시하지 않았습니다. –

0

cout<<"test: "+doIt(myfav); 

당신이 문자열 리터럴의 첫 번째 문자를 가리키는 포인터에 몇 가지 핵심 가치를 추가한다는 것을 의미 문에이 표현 "test: "+doIt(myfav) "테스트". 결과로 포인터 값을 얻습니다.

함수에서 반환 된 정수 값을 std :: string 유형의 객체로 변환하려면 연산자 +를 사용할 수 있습니다. 예를 들어

cout<<"test: "+ to_string(doIt(myfav)); 

는 C/C++에서 반환 형식 int를 가진다 주요 기능을 고려 헤더 <string> 을 포함 할 필요가이 작업을 수행합니다. 그리고 헤더 <cmath> 대신 heder 나는 프로그램이

#include<iostream> 
#include <string> 

inline int doIt(int a) { return a/1000; } 


int main() 
{ 
    int myfav = 23412; 

    std::cout << "test: " + std::to_string(doIt(myfav)) << std::endl; 

    std::cin.get(); 
} 
+0

실제로'std :: to_string'을 사용할 필요는 없습니다. 왜냐하면'std :: ostream'은'int'를 위해'operator <<'가 오버로드되어 있습니다. –

+0

@Zac Howland 저는 C#에서 사용되는 것과 같은 방식으로 operator +로 문장을 작성하는 방법을 보여 줬습니다. –

+0

@Zac Howland 연산자 +가 언제 어디서 과부하인지를 보여주는 것이 중요합니다 "test :"+ 정수와 "test :"+ std :: string의 차이점을 보여줍니다. –

2

이 내가 지적하고 싶은 몇 가지가있다 볼 수 방법을 보여줍니다 말한 모든 것을 다시 시작

를 사용하는 것이 좋습니다. 주요 함수 void main()의 첫 번째 반환 유형은 int main()이어야합니다.

당신은 +를 사용하여 문자열로 정수를 삽입 할 수 없습니다 자세한 내용 방문에 대한 코드에서 Why is "using namespace std" considered bad practice?

마지막으로 문제를 using namespace std;를 사용하지 마십시오, 당신은 다시 운영자 즉 <<을 추출해야합니다.

#include<iostream> 
#include<iomanip> 
#include <math.h> 

//using namespace std; 

int doIt(int a) 
{ 
    a=a/1000; 
    return a; 
} 
int main() 
{ 
    int myfav= 23412; 
    std::cout<<"test: "<<doIt(myfav)<<"\n"; 
    std::cin.get(); 
    return 0; 


} 
+0

'using namespace std;'가 없으면 컴파일하지 않습니다 ('cout'과'cin' 앞에'std ::'를 붙이지 않는 한). –

+0

@ZacHowland : 내 실수를 지적 해 주셔서 고맙습니다. – Shravan40

관련 문제