讨论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 打赏 收藏 转发到动态 举报
写回复
用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)

13,824

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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