《C++ Primer》1.1 编写一个简单的C++程序

本文通过一系列C++程序实例,探讨了函数返回值与类型匹配的重要性。测试涉及int、char、浮点数、字符串及结构体等,展示了不同数据类型与int的兼容性。在返回值超过int范围时,如1024,返回值会取低8位。同时,还讨论了shell环境下程序退出状态值的处理,强调了返回值在不同系统中的表现可能因位宽差异而变化。
摘要由CSDN通过智能技术生成

1.1 编写一个简单的C++程序

int类型是一种内置类型(built-in type),即语言自身定义的类型。同时int也是C++的一个关键字。

语句块(block of statements):以左花括号开始,以右花括号结束。

当return语句包括一个值时,此返回值的类型必须与函数的返回类型相容。在本例中,main的返回类型是int,而返回值0的确是一个int类型的值。

测试1:

int main()
{
    return 3.14;
}

测试结果:

etc@etc-ruc:~/cpp/ch1/1$ g++ prog1.cpp -o prog1 -Wall
etc@etc-ruc:~/cpp/ch1/1$ ./prog1 
etc@etc-ruc:~/cpp/ch1/1$ echo $?
3

测试2:

int main()
{
    return 'a';
}

测试结果:

etc@etc-ruc:~/cpp/ch1/1$ !g++
g++ prog1.cpp -o prog1 -Wall
etc@etc-ruc:~/cpp/ch1/1$ !./
./prog1 
etc@etc-ruc:~/cpp/ch1/1$ !e
echo $?
97

测试3:

int main()
{
    return "hello";
}

测试结果:

etc@etc-ruc:~/cpp/ch1/1$ !g
g++ prog1.cpp -o prog1 -Wall
prog1.cpp: In function ‘int main()’:
prog1.cpp:3:9: error: invalid conversion from ‘const char*’ to ‘int’ [-fpermissive]
  return "hello";

测试4:

int main()
{
    struct stu {
        int no, score;
    } stu_a;

    return stu_a;
}

测试结果:

etc@etc-ruc:~/cpp/ch1/1$ !g
g++ prog1.cpp -o prog1 -Wall
prog1.cpp: In function ‘int main()’:
prog1.cpp:7:9: error: cannot convert ‘main()::stu’ to ‘int’ in return
  return stu_a;

通过上诉4个例子不难感性地理解函数返回时,需要将return的数据类型转换为函数的返回类型。测试中float和char都跟int相容,且返回的是3.14转换为int后的值3和‘a’的ASCII码值97。但是,指针和复合数据类型与int不相容。

测试5:

int main()
{
    return 1024;
}

测试结果:

etc@etc-ruc:~/cpp/ch1/1$ !v
vi prog1.cpp 
etc@etc-ruc:~/cpp/ch1/1$ !g
g++ prog1.cpp -o prog1 -Wall
etc@etc-ruc:~/cpp/ch1/1$ !./
./prog1 
etc@etc-ruc:~/cpp/ch1/1$ !e
echo $?
0

将1024修改为1023,重新编译有:

etc@etc-ruc:~/cpp/ch1/1$ g++ prog1.s -o prog1
etc@etc-ruc:~/cpp/ch1/1$ !./
./prog1 
etc@etc-ruc:~/cpp/ch1/1$ !e
echo $?
255

将1023修改为-1,重新编译有:

etc@etc-ruc:~/cpp/ch1/1$ !g
g++ prog1.s -o prog1
etc@etc-ruc:~/cpp/ch1/1$ !./
./prog1 
etc@etc-ruc:~/cpp/ch1/1$ !e
echo $?
255

为什么echo $?的结果只取了低8位的整型呢?查看man手册的exit(3)可以发现答案。

The exit() function causes normal process termination and the value of status & 0377 is returned to the parent (see wait(2)).

exit是进程正常退出的5种方式之一。进程正常退出后,其返回的状态值要&0377(十进制的255,十六进制的0xFF),即取低8位返回给父进程。我们在shell环境下执行程序,其进程的父进程是shell。shell会在子进程退出后收集其子进程返回值(状态信息)的低8位。

参见《UNIX环境高级编程》7.3

同理根据补码规则,将-1修改为-255,不难可知,返回值应为1:

etc@etc-ruc:~/cpp/ch1/1$ !g
g++ prog1.s -o prog1
etc@etc-ruc:~/cpp/ch1/1$ !./
./prog1 
etc@etc-ruc:~/cpp/ch1/1$ !e
echo $?
1

在一些系统中,即使文件就在当前目录或文件夹中,你也必须显式指出文件的位置。这个跟当前shell进程的环境变量相关。因此,我们在运行可执行程序的时候需要加上“./”。

练习1.1

略。

练习1.2

参考上述测试5后扩展的实验及其结论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值