社区
C++ Builder
帖子详情
讨论return +"c:"的问题?
wjzhuang
2001-05-18 04:37:00
看到一个贴子,有语句return +"c:";竟然没事,还可以用,写了一个程序测试,
如下
AnsiString TForm1::test()
{
return +"c:";
}
//---------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ShowMessage(this->test());
}
运行后,输出 c:
这个+在这里是什么意思,作什么的?有害吗?有用吗?
...全文
531
37
打赏
收藏
讨论return +"c:"的问题?
看到一个贴子,有语句return +"c:";竟然没事,还可以用,写了一个程序测试, 如下 AnsiString TForm1::test() { return +"c:"; } //--------- void __fastcall TForm1::Button1Click(TObject *Sender) { ShowMessage(this->test()); } 运行后,输出 c: 这个+在这里是什么意思,作什么的?有害吗?有用吗?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
37 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
wjzhuang
2001-05-21
打赏
举报
回复
最近csdn有点乱,我明天看看再给分!
谢谢大家的关注!
wjzhuang
2001-05-21
打赏
举报
回复
给分了.谢谢大家的参与!
不过这种写法不应该被支持,不是好的写法.
millet
2001-05-20
打赏
举报
回复
呵呵,sundayboys(sunboy)给我下了一套啊!
我一没留神,自然而然的把 "c:\Hello" 想成了 "c:\\Hello"
fireworld
2001-05-20
打赏
举报
回复
C的指针好烦哦,你们不说我还真没有想到是它惹的祸。
to:sundayboys(sunboy)
在C中“\”与“\\”的意义是不同的。
次处"c:\Hello"该理解为\后指定C:后紧跟的是大写的H字符,就象你要返回\时,必须在\前用多一个\表明其后是\字符,“c:\Hello”,该理解为字符串的值为:c:Hello;而:"c:\\Hello" ,才是你理解的c:\Hello.
我想millet(小米) ,只是粗心了一下。
return 3+"c:\Hello"; 返回结果"ello";
return 7+"c:\Hello";返回结果“”
return 8+"c:\Hello"; 返回结果"0@"
return 9+"c:\Hello";返回结果“@”
return 10+"c:\Hello";返回结果“”
playboy132
2001-05-20
打赏
举报
回复
都是0分?
孩皮妞野
2001-05-19
打赏
举报
回复
同意HF。
在程序中写+10, 最终得到10, 这从某个意义上讲是编译器进行的简单的优化,但是在语法分析阶段,+ 被理解成了 单目正号运算符。
holyfire
2001-05-19
打赏
举报
回复
当然了 +100 和 100 编译以后不就是 100吗
rh
2001-05-19
打赏
举报
回复
我靠!讨论得真是热烈啊!!!!
我也来说两句:
我是这样看的:
先写原程序如下:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
AnsiString temp(void)
{
return "c:\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\";
//或者 return + "c:\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\";
}
void main(void)
{
ShowMessage(temp());
}
temp函数的汇编代码其实都是这样的:
@@temp$qv proc near
?live16385@0:
;
; AnsiString temp(void)
;
push ebp
mov ebp,esp
add esp,-40
@1:
mov eax,offset @@_$ECTEE$@temp$qv
call @__InitExceptBlockLDTC
;
; {
; return + "c:\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\";
;
mov word ptr [ebp-24],8
mov edx,offset s@
lea eax,dword ptr [ebp-4]
call @@System@AnsiString@$bctr$qqrpxc
inc dword ptr [ebp-12]
lea edx,dword ptr [ebp-4]
mov eax,dword ptr [ebp+8]
call @@System@AnsiString@$basg$qqrrx17System@AnsiString
mov eax,dword ptr [ebp+8]
mov word ptr [ebp-24],20
push eax
dec dword ptr [ebp-12]
lea eax,dword ptr [ebp-4]
mov edx,2
call @@System@AnsiString@$bdtr$qqrv
pop eax
mov word ptr [ebp-24],8
inc dword ptr [ebp-12]
mov edx,dword ptr [ebp-40]
mov dword ptr fs:[0],edx
;
; }
;
@3:
@2:
mov esp,ebp
pop ebp
ret 4
@@temp$qv endp
只是返回了s@的偏移。
s@是这样定义的:
_DATA segment dword public use32 'DATA'
s@ label byte
; s@+0:
db "c:\\\\\\\\\\\\\\\\\\\\\\\\\\\\",0
align 4
_DATA ends
而在主函数里这样处理:
_main segment virtual
@_main proc near
?live16390@0:
;
; void main(void)
;
push ebp
mov ebp,esp
add esp,-40
@4:
mov eax,offset @@_$ECTGE$@main$qv
call @__InitExceptBlockLDTC
;
; {
; ShowMessage(temp());
;
mov word ptr [ebp-24],8
xor edx,edx
mov dword ptr [ebp-4],edx
lea ecx,dword ptr [ebp-4]
push ecx
inc dword ptr [ebp-12]
call @@temp$qv
lea eax,dword ptr [ebp-4]
mov eax,dword ptr [eax]
call @@Dialogs@ShowMessage$qqrx17System@AnsiString
dec dword ptr [ebp-12]
lea eax,dword ptr [ebp-4]
mov edx,2
call @@System@AnsiString@$bdtr$qqrv
;
; }
;
mov ecx,dword ptr [ebp-40]
mov dword ptr fs:[0],ecx
@5:
mov esp,ebp
pop ebp
ret
@_main endp
_main ends
我想,return +“aaaa”;和return “aaaa”是一样的。
上面的程序不容易看清楚,用这样的来试:
#include<iostream.h>
char* temp(void)
{
return + "c:\\\\\\\\\\\\\\\\\\";
//以及return "c:\\\\\\\\\\\\\\\\\\";
}
void main(void)
{
cout<<temp()<<endl;
}
得到的,也全是:
@@temp$qv proc near
?live16385@0:
;
; char* temp(void)
;
push ebp
mov ebp,esp
;
; {
; return + "c:\\\\\\\\\\\\\\\\\\";
;
@1:
mov eax,offset s@
;
; }
;
@3:
@2:
pop ebp
ret
@@temp$qv endp
完全一样!
wjzhuang
2001-05-19
打赏
举报
回复
学到了不少东西。谢谢!
有没有扩展的说明。我觉得可以在讨论一下。
我再加分。保证每个人都有份.
millet
2001-05-18
打赏
举报
回复
呵呵,我到忘了这碴了! :)
以后什么问题就全靠ALNG老乡了! 呵呵
孩皮妞野
2001-05-18
打赏
举报
回复
你不是在BCBList上自我介绍过吗? 如果不是我老糊涂了你好像是说自己是武汉人在广州吧?
millet
2001-05-18
打赏
举报
回复
to :ALNG(GNLA)
>小米, 你是武汉人对吧?
>我是湖北荆门的。算不算半个老乡?
你怎么知道我是武汉人??? 呵呵,是不是我们认识啊?
孩皮妞野
2001-05-18
打赏
举报
回复
都是运算符,一个单目,一个双目。或者说一个正号,一个加号。
sundayboys
2001-05-18
打赏
举报
回复
呵呵,我理解了,3+"c:\Hello"中的+是运算符,把我弄糊涂的是+"c:\"的+号,现在清楚了,谢谢了。
holyfire
2001-05-18
打赏
举报
回复
但是1+"C:"
这时候就是一个运算符了。
holyfire
2001-05-18
打赏
举报
回复
呵呵,ALNG说的没错,如果不是指针或是值的话,换一个类或者结构编译就通不过,姜还是老的辣。
其实指针保存的也是值,这不是运算符。
^^^^^^^^^^^^^^^^^^^^
重复一遍
孩皮妞野
2001-05-18
打赏
举报
回复
没招了。 怎么没人反映一下这个问题。 我要求不高,只要纯文本就可以了。
孩皮妞野
2001-05-18
打赏
举报
回复
+-10-+-11-+-12-+-13-+
|--C-|--:-|--\-|NULL|
+----+----+----+----+
孩皮妞野
2001-05-18
打赏
举报
回复
靠, CSDN排版功能太弱了,干脆把贴子装在<pre></pre>不就结了?
+-10-+-11-+-12-+-13-+
¦--C-¦--:-¦--\-¦NULL¦
+----+----+----+----+
孩皮妞野
2001-05-18
打赏
举报
回复
小米, 你是武汉人对吧?
我是湖北荆门的。算不算半个老乡?
加载更多回复(17)
关于C++中“++”的
问题
),想起了以前和一个朋友
讨论
++符
问题
的情景(他老骂我不搞点正经事,搞这种无聊的东西),觉得颇有意思,于是现在总结了一下能想到的所有关于++符的
问题
(不一定完全正确,还望指教)。 1
在C语言中empty的用法,C ++:string.empty()是否始终等于string ==“”?
C ++:string.empty()是否始终等于string ==“”?我可以假设std::string str;... // do something to str以下陈述是否总是正确的?(str.empty() == (str == ""))Michael asked 2020-02-23T01:48:53Z7个解决方案52 ...
for里面的
return
是返回哪里c语言,
return
的用法是什么?若用在for循环中,还会执行下一次循环吗?...
这里是修真院前端小课堂,每篇分享文从【背景介绍】【知识剖析】【常见
问题
】【解决方案】【编码实战】【扩展思考】【更多
讨论
】【参考文献】八个方面深度解析前端知识/技能,本篇分享的是:【
return
的用法是什么?...
C语言操作符详解(坑点+重难点+优先级结合性总结)
✨前言✨ 这个系列作为【全网最强】的续作,在内容上不会只是走马灯式的浏览知识点,而会对各个知识点进行精讲精析,达到真正熟练的地步。虽然说博主学习C语言不过两个多月,但也熟知重...今日书籍分享:《C陷阱
int在c语言中能输出负数么,为什么使用模数时C ++输出负数?
/usr/bin/python # -*- coding: utf-8 -*- m = 7 for i in xrange(-8, 10 + 1): print(i % 7) 结果是: 6 0 1 2 3 4 5 6 0 1 2 3 4 5 6 0 1 2 3 C ++: #include using namespace std; int main()...
C++ Builder
13,824
社区成员
102,679
社区内容
发帖
与我相关
我的任务
C++ Builder
C++ Builder相关内容讨论区
复制链接
扫一扫
分享
社区描述
C++ Builder相关内容讨论区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章