问个c++中main函数外调用的问题

gdfjupiter 2008-12-16 11:35:54
为什么下面的代码会出错

#include <iostream>

printf("out of main\n");

int main()
{
system("pause");
return 0;
}



又为什么下面的代码会成功

#include <iostream>

int a = printf("out of main\n");

int main()
{
system("pause");
return 0;
}


好像在C中又有不同
...全文
363 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
bfhtian 2008-12-16
  • 打赏
  • 举报
回复
mark
SearchLife 2008-12-16
  • 打赏
  • 举报
回复

#include <iostream>
using namespace std;

int f()
{
return 1;
}

int a = f();


int main()
{
cout << a << endl;
system("pause");
return 0;
}




printf实际上库里的一个预先编译好的代码。
在进入main之前,事先由c运行期函数进行了处理。main其实不是真正的入口函数。
GreaterHeat 2008-12-16
  • 打赏
  • 举报
回复
#include <iostream>

printf("out of main\n");

int main()
{
system("pause");
return 0;
}
这个里面的printf("out of main\n"); 成了孤立语句,程序永远不可能执行到这句了.并且,在main函数外,好像都是只有函数和变量定义和声明(宏定义以及typedef等排除),而函数或变量的定义或声明是需要有数据类型的.这里的printf()是函数,没有数据类型,当然出错了.
int a = printf("out of main\n"); 这句语句在程序调用变量a时就可以执行到该语句.而且a是有地址的,并且为全局的变量.
SearchLife 2008-12-16
  • 打赏
  • 举报
回复
代码段里面是可执行代码,段属性可读可执行不可写
数据段里是堆/全局变量和静态变量.....,段属性是可读可写不可执行
堆栈段里面是返回地址/局部变量......段属性是可读可写可执行
长安宁 2008-12-16
  • 打赏
  • 举报
回复
第一种情况,是在函数体外,有语句;
第二种情况,是赋值

但是不建议这样做,只定义一个全局变量就可以了
sinux_1983 2008-12-16
  • 打赏
  • 举报
回复
mark
toadzw 2008-12-16
  • 打赏
  • 举报
回复
#include <iostream>

printf("out of main\n");

int main()
{
system("pause");
return 0;
}
---------------
程序的入口点是main,那printf什么时候执行呢?

换成int a = printf("out of main\n");这时明确了,在生成全局变量时执行。

这只是个人理解,其实严格说,语法就是这样规定的。
lann64 2008-12-16
  • 打赏
  • 举报
回复
#include <iostream>

printf("out of main\n");

int main()
{
system("pause");
return 0;
}
---------------
程序的入口点是main,那printf什么时候执行呢?

换成int a = printf("out of main\n");这时明确了,在生成全局变量时执行。

这只是个人理解,其实严格说,语法就是这样规定的。
gdfjupiter 2008-12-16
  • 打赏
  • 举报
回复
上面的编译环境是dev c++ 4.9
pony_ml 2008-12-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 SearchLife 的回复:]
代码段里面是可执行代码,段属性可读可执行不可写
数据段里是堆/全局变量和静态变量.....,段属性是可读可写不可执行
堆栈段里面是返回地址/局部变量......段属性是可读可写可执行
[/Quote]
研究得越来越透彻了阿
knate 2008-12-16
  • 打赏
  • 举报
回复
printf("out of main\n");

函数必须标明返回类型。
gdfjupiter 2008-12-16
  • 打赏
  • 举报
回复
这样理解的:
单独的printf()过不了编译,是因为在函数体外,不符合语法规定;
int a = printf()是定义一个全局变量,并初始化,没有语法问题,可以编译并执行。

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧