c++ - 函数内部cout无法使用
阿神
阿神 2017-04-17 15:33:57
0
1
1390

平台:win10+vs2017
代码1:

#include<iostream>
#include<cstdio>
using namespace std;
int nice(int p, int e, int i, int d) {
    int k = d + 1;
    while ((k % 33) != 0)
    {
        ++k;
    }
    for (; k < 21252; k += 33)
    {
        if (((k - p) % 23 == 0) && ((k - e) % 28 == 0))
            return (k - d);
    }
}
int main()
{
    cout << nice(0, 0, 0, 0) << endl;
    system("pause");
    return 0;
}

执行成功。
如果我把nice函数中if语句块的return变成cout,再将函数返回类型变成void。程序不执行该语句。
代码如下:

#include<iostream>
#include<cstdio>
using namespace std;
void nice(int p, int e, int i, int d) {
    int k = d + 1;
    while ((k % 33) != 0)
    {
        ++k;
    }
    for (; k < 21252; k += 33)
    {
        if (((k - p) % 23 == 0) && ((k - e) % 28 == 0))
            cout << (k - d) << endl;
    }
}
int main()
{
    nice(0, 0, 0, 0);
    system("pause");
    return 0;
}

请问这是什么原因呢?我第一个代码执行成功不就表示程序逻辑正确并且可以执行到if的语句体吗?为什么把return改成cout语句以后就失败了呢?

阿神
阿神

闭关修行中......

모든 응답(1)
迷茫

if 분기가 실행되지 않았기 때문입니다.

으아악

예제 1의 nice를 내가 제공한 nice로 바꾸면(다른 부분을 수정하지 않고 끝에 return -1;을 추가했습니다) 프로그램 출력은 -1이 됩니다. 이는 if 분기가 실행되지 않았음을 나타냅니다. 그렇지 않으면 함수가 일찍 반환됩니다. (33, 23, 28의 최소 공배수는 21252이지만 for는 루프 본문에 들어갈 때마다 k가 21252보다 작도록 보장합니다.)

예제 1의 코드로 인해 정의되지 않은 동작이 발생합니다. 결과는 일반적으로 설명할 수 없는 값이 반환됩니다. 그리고 이 값은 여러분이 기대하는 값일 수도 있습니다.

자세히 살펴보면 vs2017에서 다음 경고를 보고합니다.

경고 C4715 '좋음': 모든 제어 경로가 값을 반환하는 것은 아닙니다

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿