为了账号安全,请及时绑定邮箱和手机立即绑定

为什么在不返回值的情况下从非空函数的末尾流出不产生编译器错误?

为什么在不返回值的情况下从非空函数的末尾流出不产生编译器错误?

C++ C
慕桂英3389331 2019-06-06 13:14:05
为什么在不返回值的情况下从非空函数的末尾流出不产生编译器错误?自从很多年前我意识到这不会在默认情况下产生错误(至少在GCC中),我一直在想为什么?我知道您可以发出编译器标志来产生警告,但是它不应该总是一个错误吗?为什么不返回值的非空函数是有效的?评论中要求的一个例子:#include <stdio.h>int stringSize(){}int main(){     char cstring[5];     printf( "the last char is: %c\n", cstring[stringSize()-1] );      return 0;}.编译.
查看完整描述

3 回答

?
慕斯709654

TA贡献1840条经验 获得超5个赞

GCC在默认情况下不会检查所有代码路径是否返回一个值,因为通常不能这样做。它假设你知道你在做什么。考虑使用枚举的常见示例:

Color getColor(Suit suit) {
    switch (suit) {
        case HEARTS: case DIAMONDS: return RED;
        case SPADES: case CLUBS:    return BLACK;
    }

    // Error, no return?}

你的程序员知道,除了一个错误,这个方法总是返回一个颜色。GCC相信你知道你在做什么,所以它不会强迫你把回报放在函数的底部。

另一方面,javac试图验证所有代码路径都返回一个值,如果不能证明它们都返回值,则抛出一个错误。此错误是Java语言规范强制要求的。请注意,有时它是错误的,您必须放入一个不必要的返回语句。

char getChoice() {
    int ch = read();

    if (ch == -1 || ch == 'q') {
        System.exit(0);
    }
    else {
        return (char) ch;
    }

    // Cannot reach here, but still an error.}

这是哲学上的不同。C和C+比Java或C#更容易理解和信任,因此新语言中的一些错误是C/C+中的警告,一些警告默认被忽略或关闭。


查看完整回答
反对 回复 2019-06-06
  • 3 回答
  • 0 关注
  • 592 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信