[问题] UVA 10189

楼主: ssadd502227 (我想考试)   2015-04-06 21:06:24
开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
踩地雷简单题,因为懒得用二维阵列去做就去网络上找用map写法的
看到有一个是写成以下这样
#include<iostream>
#include<map>
using namespace std;
int n1,n2,h=1;
int main(){
while(cin>>n1>>n2&&n1!=0&&n2!=0)
{ if(h>1){cout<<endl;}
map<int,map<int,char> >a;
for(int i=0;i<n1;i++)
{
for(int ii=0;ii<n2;ii++)
{
cin>>a[i][ii];
}
}
cout<<"Field #"<<h<<":"<<endl;
for(int i=0;i<n1;i++,cout<<endl)
{
for(int ii=0;ii<n2;ii++)
{
if(a[i][ii]=='*'){cout<<"*"; continue;}
#define A(R,C) (a[R][C]=='*')
int ans=A(i-1,ii-1)+A(i-1,ii)+A(i-1,ii+1)
+A(i,ii-1)+A(i,ii)+A(i,ii+1)
+A(i+1,ii-1)+A(i+1,ii)+A(i+1,ii+1);
cout<<ans;
}
}
h++;
}
}
想请问 #define A(R,C) (a[R][C]=='*')
int ans=A(i-1,ii-1)+A(i-1,ii)+A(i-1,ii+1)
+A(i,ii-1)+A(i,ii)+A(i,ii+1)
+A(i+1,ii-1)+A(i+1,ii)+A(i+1,ii+1);
这一整段是啥意思?
作者: LPH66 (-6.2598534e+18f)   2015-04-06 21:40:00
这写法错得离谱
楼主: ssadd502227 (我想考试)   2015-04-06 21:41:00
我贴到我之前打错的版本= = 请问一要怎样修改文章?
作者: suhorng ( )   2015-04-06 21:45:00
在文章列表 自己的文章前大写 E
楼主: ssadd502227 (我想考试)   2015-04-06 21:48:00
改好了感恩
作者: Killercat (杀人猫™)   2015-04-06 21:55:00
你把它取代一下不就知道了... 不过这用了C++一个漏洞boolean是会被当成int 1的 这个应该很多编译器都会给你警告吧(?)上面打错 是boolean的true被当1 false被当0
楼主: ssadd502227 (我想考试)   2015-04-06 22:11:00
所以这算很烂的写法?
作者: suhorng ( )   2015-04-06 22:19:00
这是啥漏洞@@不是标准规定的转型吗?
作者: Killercat (杀人猫™)   2015-04-06 22:25:00
0可以表为false待无疑义,但是true可以表为1 2 3 4 5不过我用词的确不好,与其说漏洞,还不如说陋习....跟const char* a = "12345abcde";一样不太建议的写法
作者: bibo9901 (function(){})()   2015-04-06 23:21:00
@@ 为什么不太建议?
作者: Frozenmouse (*冰之鼠*)   2015-04-07 00:15:00
不特别讲我还真不知道 true + true 是啥…
作者: LPH66 (-6.2598534e+18f)   2015-04-07 02:13:00
这性质的滥用法多的咧, 例如 #1FMBb9lE (Programming)
作者: steve1012 (steve)   2015-04-07 09:37:00
因为true只代表不是零 只是这样写通常都是1但规定里面并没有提到true=1 所以并不是很安全把A(x,y) 改写成function就很安全了
作者: Feis (永远睡不着 @@)   2015-04-07 09:49:00
true 跟 1 的关系有点复杂. C++ 里 true 运算时就是 1详情可参阅 #1J0fVosb而在 C99, true 就真的是整数 1
作者: suhorng ( )   2015-04-07 11:40:00
@steve1012: 不对, C++ 里的 bool 转成 int 一定是 true转成 1, false 转成 0; 反过来是非零转成 true, 零转成false
作者: steve1012 (steve)   2015-04-07 12:45:00
那这样应该蛮安全的吧?
作者: Killercat (杀人猫™)   2015-04-07 15:54:00
算安全,Spec 4.7里面有提到这件事但是很烂,你一连串int算式夹个boolean 只会迷惑人而且你没办法反过来推这个算式我可以换句话说,C- string也是安全的啊... XD但是const char *a = "12345abcde";真的不是很建议不过就跟x^=y^=x^=y一样 总会有人用的... XDp.s. 上面那个算是也是spec safe
作者: Feis (永远睡不着 @@)   2015-04-07 16:00:00
x^=y^=x^=y 安全? 我错过什么了?如果 C string 不能用. 那你在 C 里面推荐怎么作字串?
作者: suhorng ( )   2015-04-07 16:32:00
x ^= y ^= x ^= y 是 undefined behavior.......
作者: Killercat (杀人猫™)   2015-04-07 17:15:00
我当然说是在C++里面啦...诶 我一直以为是spec safe,看来我一直印象错误了
作者: firejox (Tangent)   2015-04-07 17:57:00
const char *的问题是什么?
作者: Killercat (杀人猫™)   2015-04-07 18:38:00
一个指标指向string literal是个惯例,但是不合理他把string literal隐式转型成const char*了
作者: bibo9901 (function(){})()   2015-04-07 19:01:00
可是 string literal 实实在在地存在 .rodata 里啊既然如此用 const char * 去存一个 static const char[]哪里不合理? 又不像 integer literal 很可能跟本不在内存里面
作者: Killercat (杀人猫™)   2015-04-07 20:57:00
他不合理的地方是隐式转换 而非存取方式拿一个const char*存一个string literal是非常合理的
作者: Feis (永远睡不着 @@)   2015-04-07 21:11:00
楼上这论点蛮有趣的. 请教一下怎么不做任何隐性转换用string literal ? (当然我讲的是当作字串在 "用")例如把 "Hello world" 印出来~阿. 是改成显性转换?
作者: Killercat (杀人猫™)   2015-04-07 21:37:00
这其实就是靠惯例去做的,版上讨论也不只一次啦...不然这个从语法上看起来lhs跟rhs根本是不同的东西不是说这个不好,但是有std::string了,我个人会比较建议就多用点std::string,少用点C- string吧const char*能被string literal赋值靠的是两个惯例一个是我刚前面提的隐式转换,另外一个则是隐含的\0前者其实是很迷惑的,因为你无法从const char*得知你到底拿到的是什么(你还需要知道长度或者“他是\0字”)不像拿到int*就知道“指向一个长度sizeof(int)的整数”更不用讲很多人还拿char*去接,维护这种很头大的当然也可以理直气壮的说“看到const char*就该想到啊”这我就真的没意见了,碰到就知道痛 :P
作者: firejox (Tangent)   2015-04-07 22:05:00
这些写C的就会碰到阿QQ 不过如果compiler的选项有开是会有warning 提醒的(char*的话) 不过pointer的话void* 是会更难理解吧0_0
作者: Feis (永远睡不着 @@)   2015-04-07 22:17:00
你没有隐性转型是不可能用 std::string 去接 string literal这不是惯例的问题. 是语言本身特性.你可以说 std::string 相对包装得比较好. 但是跟 stringliteral 转型的问题没关系更不幸地是 C++11 的 std::string 后面还是有 '\0'
作者: Killercat (杀人猫™)   2015-04-08 00:35:00
std::string至少你不用思考“他到底是三小”他就只是个string,既不伟大也不卑微(诶)接到个const char*(更甚者, char*)你要烦恼的可多了...有看过function传char* 有时是ascii有时是binary的吗XD不过也因为如此 我专案都要求用vector<unsigned char>来当作binary的载体而非char*就是...有点矫枉过正哩...总觉得binary用char*其实就够了 XD(以上都是实际碰过的心得分享而已)
作者: Feis (永远睡不着 @@)   2015-04-08 00:46:00
你后面这段话跟我要解释的没关系~ 所以我想可能误解了什么我也认为在 "一般情况" 下, "C++" 里用 std::string 会比较好, 但是 这跟 string literal 会隐性转型没关系std::string 无法解决 string literal 会隐性转型的问题顺带一提, 用 vector<unsigned char> 作为字串运算可能不是个好主意..阿. 上面这句是我误会XD 抱歉 Orz
作者: Killercat (杀人猫™)   2015-04-08 09:30:00
其实主要是在解释为什么const char*接字串不好主要就是因为意义不明(因为他意义在于两个惯例之上)能work嘛?可。合理吗?也许。这样好吗..?不太好
作者: Feis (永远睡不着 @@)   2015-04-08 09:33:00
string literal 在 C 用 const char * 之类的是 Spec 设计的我不确定用惯例这个名词是否合理"他不合理的地方是隐式转换" 是你说的. 我只是要解释这点std::string a = "Hello world"; 不只隐性转型还做了两次C++ 没有把 C 的 string literal 打掉重练反而后来有点妥协就好像我常常希望能跟别人说 : 忘了 const char * 吧但是 std::string 的建构式最常用的参数就是 const char *
作者: Killercat (杀人猫™)   2015-04-08 13:20:00
er...我通常写std::string a("Hello World");椰 XD不过这纯粹是习惯不同就是

Links booklink

Contact Us: admin [ a t ] ucptt.com