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后扩展的实验及其结论。