关于C++调用php调用js函数返回值值的一些小问题,求大神

扫二维码下载作业帮
2亿+学生的选择
下载作业帮安装包
扫二维码下载作业帮
2亿+学生的选择
一道C++笔试选择题这一题的答案是D,但我对其中的B选项有疑问,既然定义了函数有返回值,为什么函数调用还可以无返回值?求解释(19)若已定义的函数有返回值,则以下关于该函数调用的叙述中错误的是 A)函数调用可以作为独立的语句存在B)函数调用可以无返回值C)函数调用可以出现在表达式中 D)函数调用可以作为一个函数的形参
扫二维码下载作业帮
2亿+学生的选择
个人觉得就是没把函数返回值赋给一个变量,也就是把有返回值的函数当void类型调用。
为您推荐:
扫描下载二维码欢迎加入我们,一同切磋技术。 &
用户名: &&&
密 码: &
共有 3860 人关注过本帖
标题:[求助]如何实现函数的多个返回值?
等 级:新手上路
帖 子:15
&&问题点数:0&&回复次数:10&&&
[求助]如何实现函数的多个返回值?
一个函数通过return()只能有一个返回值,并且遇到第一个return是就结束函数,请问用什么方法可以实现函数有多个返回值?
搜索更多相关主题的帖子:
等 级:新手上路
帖 子:15
除用外部变量的方法,请问还有什么其他办法?
若不同心 岂能同行 不相信我 就别靠近我 !
等 级:新手上路
帖 子:31
可以用指针,或者用引用,但是有可能增加不同函数之间的粘合度,有时候不是什么好事.
等 级:新手上路
帖 子:15
恩,谢谢3楼的兄弟~
若不同心 岂能同行 不相信我 就别靠近我 !
等 级:论坛游民
帖 子:249
专家分:14
能举出具体的例子来吗?谢谢了
等 级:贵宾
威 望:17
帖 子:1094
第二站>>>提供源码下载
等 级:新手上路
帖 子:15
顶楼上的!当传递引用后在函数体里可改变别的其他的变量值而返回!
等 级:新手上路
帖 子:19
//使用引用,例子如下#include"iostream.h"void fun(int& a,int& b,int& c){ a=a+2;
c=c-1;}void main(){ int a,b,c;
cout&&"请输入三个数"&&
cin&&a&&b&&c;
fun(a,b,c);
cout&&"a="&&a&&
cout&&"b="&&b&&
cout&&"c="&&c&&}
编程之道千千万,立志成才路路通。
等 级:新手上路
帖 子:19
//使用引用,例子如下#include"iostream.h"void fun(int& a,int& b,int& c){ a=a+2;
c=c-1;}void main(){ int a,b,c;
cout&&"请输入三个数"&&
cin&&a&&b&&c;
fun(a,b,c);
cout&&"a="&&a&&
cout&&"b="&&b&&
cout&&"c="&&c&&}
编程之道千千万,立志成才路路通。
等 级:新手上路
帖 子:100
我一直告诫自己:要做一个踏实认真的人
版权所有,并保留所有权利。
Powered by , Processed in 0.320080 second(s), 8 queries.
Copyright&, BCCN.NET, All Rights Reserved如何优雅的处理(或忽略)c++函数返回值代表的错误? - 知乎103被浏览4550分享邀请回答int ret1 = f();
if (ret1 & 0)
error(ret1);
int ret2 = g(ret1);
if (ret2 & 0)
error(ret2);
int ret3 = h(ret2);
很多人避免中途返回,是因为后面需要释放已经分配的资源。在 C++ 中,应该一旦分配资源,就立即使用 RAII 或者 ScopeGuard 来自动清理。比如FILE* file = fopen(filePath.c_str(), "rb");
if (file == NULL)
return data;
ON_SCOPE_EXIT
fclose(file);
或者char* buffer = malloc(buf_size);
ON_SCOPE_EXIT
free(buffer);
这样的写法,可以保证资源永远都会被释放。就可以放心地中途退出。这种写法也使得重构代码更容易,可以将资源分配和释放的代码一起移动,因为它们是靠在一起的。那些使用 goto, 或者 while (true) break 的,可以缓解一部分问题。但在C++中,没有ScopeGuard 通用和优雅。我很希望C++可以定义出一个类似 Go 语言或者 Swift 语言的 defer 特性,或者将 ScopeGuard 添加到标准库中。这样就不用不同项目各自实现风格各异的 ScopeGuard 了。关于 ScopeGuard 更详细的内容,参考这篇文章 ----------------我个人是不喜欢异常 exception 的。以往我一直觉得异常是很好的特性,但现在觉得异常并非一定是好的。异常的问题在于发生异常的地方与处理异常的地方分离开来,真正处理的时候难以收集到足够的信息。异常也容易滥用,很容易只抛出异常而不处理,或者干脆在最外层接收所有异常,再打印出异常信息。这样的话,也就失去了异常处理的意义。用错误码虽然看起来死板麻烦,但会是可控的。有些人会说,构造函数出现错误怎么办,那时没有返回值,也就没有错误码。这种情况下,只要简单让构造函数不会出现错误就行了,构造函数会出现错误,是因为在里面做太多事情了。比如我就不会在构造函数中打开文件,而是提供 open 或者 init 的成员函数,在里面打开。----------------再来说说使用错误码的接口设计。这样设计接口很常见:typedef enum
ErrorCode_OK = 0,
ErrorCode_Err1 = 1,
} ErrorCode;
ErrorCode doSomething(Arg0 arg0, Arg1, arg1);
doSomething 通过错误码来判断错误。但因为有很多函数会返回 bool 或者指针来表示对错,绝大多数非 0 表示成功。上面那种函数接口设计,会容易将函数误用成:if (!doSomething(arg0, arg1))
// 错误处理,
// 其实这样应该是调用成功的, 被误用了
包含错误码的接口应该设计成bool doSomething(Arg0 arg0, Arg1, arg1, ErrorCode* error);
但需要简单判断对错,就这样使用if (!doSomething(arg0, arg1, nullptr))
// 错误处理
但需要考虑更详细的错误信息,就这样调用ErrorCode errCode;
if (!doSomething(arg0, arg1, &errCode))
// 使用errCode来进行更详细的错误处理
84 条评论分享收藏感谢收起2640人阅读
C++太繁杂了,先接触C++后接触python这样的语言,你就再也不想碰它,因为,就连一个函数返回值都一大堆的说道,这里面的玄机,连工作三年的C++熟手都未必能准确的理解和运用。
& & & & 归根结底,C++所面临的问题要求它提供各种各样的机制以保证性能,也许,这辈子也见不到C++能安全有效的自己进行内存垃圾回收。。。。。
& & & & 老程序猿都会提醒菜鸟,注意函数的返回值,因为,很可能,你的函数返回的数据在后续的使用中会出错。那么函数在返回值时要注意什么呢?
& & & & 本篇博客尝试用最简练的普通大白话,讲解函数返回值的问题。
& & & & C++把内存交给了程序猿,但是,请你注意,它可没把所有的内存都交给你,交给你的只是堆上的内存,也就是你通过malloc函数& 和new 关键字申请来的内存,除了这些内存以外,其他的内存,你最好别碰,最好别碰,最好别碰,重要的事情说三遍。
& & & & 如果你的函数返回值在后续使用中出错了,尤其是返回函数内的局部变量这种事情,那么,基本可以肯定,你碰了不该碰的内存。这时候,你会觉得自己很冤枉啊,我没有啊。但事实是,没有冤枉你,所以,为了不被bug检察院起诉你,作为一个C++程序猿,你必须学会甄别那些内存是能碰的,那些内存是不能碰的。
& & & && char *pstr = &This is the buffer text&;
& & & & & 如果你的函数是这么写的,那么恭喜你,返回正确,因为这个pstr指向的是常量存储区,这里的内存,你是可以碰的,但是注意,这个碰,仅仅是读,你想修改,那是万万不可以的。
& char buffer[] = &This is the buffer text&;
& & & & &如果你的函数是这么写的,那么恭喜你,等着bug联邦检察院起诉你吧。这里的buffer指向的是栈上内存,这个,就是你碰不得的,前面的pstr就好比公园,公园嘛,大家都可以来玩,但是你不能把公园里的假山拆了,你也不能把公园里的树砍了,你只能是来玩,不能修改它,栈上的内存,就好比是私家花园,你一个外人,是不能进去的。那么怎么甄别的,方法倒也简单,你见到带中括号的,就应该明白,这东西是栈上的,出了这个函数,你就别想再碰的,你只要敢碰,bug联邦检察院就会起诉你。
& & & & & & & static char buffer[] = &This is the buffer text&;
如果你的函数是这么写的,那么恭喜你,返回正确,可是刚才不是明明说,这里是私家花园嘛,没错,但是你注意看,前面还加了一个static,只要加了这个关键字,就相当于说国家把这个私家花园征用了,那么,它就从私家花园变成了静态存储区里的一个小花园,静态存储区里的内存,国家说,静态存储区对外开放,你们都可以来。
& & & & & & &函数返回的都是值拷贝,栈上的内存,在函数结束的时候,都会被收回。在函数内部,你可以碰栈上的内存,那是因为这个时候你是在栈的家里做客,那他们家的内存小花园当然允许你访问,可是函数结束了,就相当于你离开了栈的家,栈把内存小花园的门关上了,你怎么可以进去,你进去了,就会被bug联邦法院起诉!
& & & & & & &但是呢,总有一些奇怪的现象让你以为你可以在函数结束后仍然可以访问栈上的内存。
& & & & & & 我们定义一个结构体
struct person
& & & & & & 写一个函数
getperson2()
p.age = 99;
return &p;
& & & & & 在得到函数的返回值以后,你可以输出对象的年龄
person *p2 = getperson2();
cout&&p2-&age&&
& & & & & &你会发现,这段代码居然可以正确执行!在函数getperson2内部,p这个变量是局部变量,必然是在栈上申请的,返回的是&p,这不就是栈上的内存地址么,那为啥在函数外部,却仍然可以输出age呢?
& & & & & &虽然,函数结束后,对象被销毁,但是销毁的不够彻底,似乎计算机在管理内存时也不需要那么彻底的销毁一个对象,你之所以能输出age,那是因为那个区域,没有被彻底销毁,这一小块的内存(存储age的4个byte)没有发生变化。你可以暂时的碰这块内存,但迟早是要出问题的,如果某一刻,计算机打算用这块内存,发现你在非法使用,那么必然会报警,然后bug联邦检察院会起诉你。
& & & & & &为了让问题更透明一些,我们修改一下结构体
struct person
name = new char(10);
strcpy(name,&sheng&);
name = NULL;
& & & & & &&person*
getperson2()
p.age = 99;
return &p;
person *p2 = getperson2();
cout&&p2-&age&&
cout&&p2-&name&&
& & & & & 这一次,函数结束后,对象的销毁要比上一次彻底的多,虽然,age的区域还是没有被彻底销毁,但是name区域被彻底销毁了,如果你访问name的区域,就必然出错,这就好比啊,私家花园关门了,可是花园好大的,所以不是每一处都安装了摄像头和报警器,比如age这片区域,所以,你偷偷的从age这个区域溜进去时,花园的主人没发现,直到花园的巡防大队到age区域巡防时,发现你竟然在这里偷偷菜花,结果就是把你打的崩溃了。而name这边区域,在~person这个析构函数中安装了摄像头和报警器,你只要来,就立刻报警,然后把你打的崩溃。
& & & & & 千言万语,汇成一句话,函数不要返回指向栈的内存地址,切记,是地址,别被吓的所有的函数内的变量都不敢返回,只要不是栈的内存地址,你尽管放心的返回。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:164382次
积分:3102
积分:3102
排名:第10523名
原创:150篇
评论:19条
(1)(1)(2)(1)(4)(6)(11)(2)(2)(17)(3)(4)(11)(8)(10)(5)(3)(2)(2)(5)(19)(1)(3)(2)(9)(1)(1)(1)(3)(6)(5)(1)}

我要回帖

更多关于 js调用函数返回值 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信