欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-04 08:45:30
...

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

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

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

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

测试1:

int main()
{
    return 3.14;
}

测试结果:

[email protected]:~/cpp/ch1/1$ g++ prog1.cpp -o prog1 -Wall
[email protected]:~/cpp/ch1/1$ ./prog1 
[email protected]:~/cpp/ch1/1$ echo $?
3

测试2:

int main()
{
    return 'a';
}

测试结果:

[email protected]:~/cpp/ch1/1$ !g++
g++ prog1.cpp -o prog1 -Wall
[email protected]:~/cpp/ch1/1$ !./
./prog1 
[email protected]:~/cpp/ch1/1$ !e
echo $?
97

测试3:

int main()
{
    return "hello";
}

测试结果:

[email protected]:~/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;
}

测试结果:

[email protected]:~/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;
}

测试结果:

[email protected]:~/cpp/ch1/1$ !v
vi prog1.cpp 
[email protected]:~/cpp/ch1/1$ !g
g++ prog1.cpp -o prog1 -Wall
[email protected]:~/cpp/ch1/1$ !./
./prog1 
[email protected]:~/cpp/ch1/1$ !e
echo $?
0

查看汇编代码:

[email protected]:~/cpp/ch1/1$ g++ prog1.cpp -S
[email protected]:~/cpp/ch1/1$ vi prog1.s 

汇编代码如下:

main:
.LFB0:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    movl    $1024, %eax
    popq    %rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc

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

[email protected]:~/cpp/ch1/1$ g++ prog1.s -o prog1
[email protected]:~/cpp/ch1/1$ !./
./prog1 
[email protected]:~/cpp/ch1/1$ !e
echo $?
255

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

[email protected]:~/cpp/ch1/1$ !g
g++ prog1.s -o prog1
[email protected]:~/cpp/ch1/1$ !./
./prog1 
[email protected]:~/cpp/ch1/1$ !e
echo $?
255

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

[email protected]:~/cpp/ch1/1$ !g
g++ prog1.s -o prog1
[email protected]:~/cpp/ch1/1$ !./
./prog1 
[email protected]:~/cpp/ch1/1$ !e
echo $?
1

​ 由上述的实验可以得出结论,在当前环境下,系统以无符号数的方式处理eax寄存器的低8位(即al)。

​ 在一些系统中,即使文件就在当前目录或文件夹中,你也必须显式指出文件的位置。这个跟当前shell进程的环境变量相关。

练习1.1

​ 略。

练习1.2

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