免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: wwwsq
打印 上一主题 下一主题

531,继续抽某昏昏 [复制链接]

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
151 [报告]
发表于 2012-09-25 13:56 |只看该作者
回复 150# 幻の上帝


    照你这么说,我宁愿相信c里没有变量这个说法,或者变量就是一个包含值+名以及所有与之相关信息的集合。这个集合的名字参与了表达式运算,就是在指代这个集合的参与(中国参加了比赛,而“中国”这两个字参加了比赛这个说法已经是类似二维指针的行为了,是偷换概念)那么就是这个集合参与了。所以我说中国参加了比赛,这句话里面有中国这两个字,但不代表是这两个字参加的比赛,而是这两个字代表的实体去参加比赛的。同样,标识符是表达式,同样不代表标识符本身可以计算,参与计算的是标识符代表的变量,即是变量参与表达式的计算(类比是中国这个国家而不是两个汉字参加的比赛)。

论坛徽章:
0
152 [报告]
发表于 2012-09-25 17:51 |只看该作者
回复 151# starwing83

“中国参加了比赛”是没有歧义的借代(本体和借体的外延清晰,谁都知道本来指的是什么),不算偷换概念。未明确外延时讨论概念之间的关系,没法使用这种修辞。
相信C没有变量的确是最简单的。

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
153 [报告]
发表于 2012-09-25 18:46 |只看该作者
回复 152# 幻の上帝


    那我得问个问题,在考虑了作用域等等外在条件的情况下,说“a = 1”表达式的左参数是主表达式变量a这种说法,有没有歧义?如果没有,那至少这里能不能说变量就是表达式?

论坛徽章:
0
154 [报告]
发表于 2012-09-25 22:06 |只看该作者
回复 153# starwing83

a = 1中a是指称变量a的表达式,说a是表达式a或者说a是变量a都是清楚的,都没问题。但不表示表达式a和变量a是一回事,两者不等价也无可比性:表达式a不是变量a,变量a不是表达式a。

论坛徽章:
0
155 [报告]
发表于 2012-09-25 22:08 |只看该作者
回复 154# 幻の上帝

struct a : public 变量a, public 表达式a
{};

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
156 [报告]
发表于 2012-09-25 23:00 |只看该作者
回复 155# 幻の上帝


    按照C++的is-a的说法,a是变量,并且a也是表达式,问题是,这里面应该是有更深一层的关系的。为什么a是表达式?一个明显的答案是C语法是这么规定的。但是,为什么C语法如此规定呢?因为这样a背后所代表的东西才能够参与运算。而a背后代表的无论是一个object还是一个entity,甚至决定参与什么运算的a的类型,都是跟单纯的标示符a没关系的,而恰恰举出的这所有的部分都是变量a的一部分,如果说表达的话:

struct 表达式 {
   virtual 类型();
   virtual 值();
   virtual storage_location();
   virtual entity(); // 其他表达式需要的属性,比如左值右值什么的
};

struct 变量 {
   类型();
   值();
   存储位置();
   entity();
};

struct a : public 表达式, public 变量 {
};

至少,“a是变量”这个前提条件是“a能被C规定为是表达式”这个结果的一个必要因素。所以在这个基础上(更深层次地说),a是变量决定了a有可能是表达式,因此说变量是表达式也是有道理的。

论坛徽章:
0
157 [报告]
发表于 2012-09-26 00:33 |只看该作者
starwing83 发表于 2012-09-25 23:00
回复 155# 幻の上帝



这是语义学的问题了。你可以先思考一下,我们说‘平安路23号’可以代表‘普天公司’,甚至直接说‘23号’就是‘普天公司’。但这并不表示普天这家公司就是23这个数字。

identifier是被用来指称、指代一个对象。但这个identifier并不是这个对象本身,这个identifier有其自身的属性,对象也有自身的属性。只是在‘指称’这个事件上,identifier和对象发生了关联而已。

论坛徽章:
0
158 [报告]
发表于 2012-09-26 00:40 |只看该作者
本帖最后由 幻の上帝 于 2012-09-26 00:45 编辑

(擦。。。又忘记勾上禁用表情……)

回复 156# starwing83

当你说“为什么C语法如此规定呢”的时候,就已经超越C的范畴了——C没有强大到能自举它的语义。C的背后的变量和标识符再怎么合理或者不合理,也没法改变像语法这样的“死”的事实的既定性质。假设“C语法是这么规定的”不合理,你也没办法——它已经这样地使用了这么多年,而改变它需要做好改变所有用户的认识的准备。
你大概没清楚地理解我想说的entity是什么。entity意味着它是语言抽象的目标——除了不是单用来引用entity的手段(名称,包括C++这样的name、identifier等),它可以是能影响语义(排除label等)表达(程序行为)的任何抽象的东西。即便没有明确entity的概念(就像ISO C一样),entity和name的区别是实在的、无法忽视的。对于允许同一个名称在不同上下文的含义发生改变的语言(有做不到这点的语言么……应该有,但看来没实际意义)来说,variable能够具有类型,一个前提就是它不是name,或者说,只要有必要,variable和variable name之间总可以找到绝对的界限来区分。否则,字面上的和背后的含义就无法分辨了——谁知道你这个variable name意味着是哪个variable?

//以下伪代码以C++为例。

class token
{
//...
};

class identifier : public token
{
//...
};

class punctuator : public token
{
//...
};

class alternative_token : public token
{
//...
};

typedef unspecified<token> token_list;

class name
{
//...
};

name make_qualified_name(token_list);
token_list parse_name(name);

class expression //原本想final……看在一堆virtual上就算了。
{
private:
   expression_impl* pimpl // for storage of tokens
public:
   expression(token_list);
   virtual type get_type();
   virtual value& get_value(); //对于无副作用的语言,去掉&
private:
   virtual storage_location(); //这个不是必要的公共接口。
   entity get_entity(name) throw(error); //不必然成功,表达式并非一定能引用实体,名称也不一定正确——可能没有声明。
   virtual void verify_sema_rules() throw(error, warning);
public:
   //accessors for value category、enclosing scope、attributes...
};
// entity不出现在其中,因为entity是抽象上最顶层的东西,并不和表达式关联(不像name/identifier这样可以通过语法直接或间接的定义)。ISO C++之所以用单独列举外延而不是描述内涵或和表达式放在一起来定义这个概念,这应该是重要原因。

enum class entity_category
{
  object,
  function,
  reference,
  type
  //...略
};

entity_category get_referent_category(entity_category);

class entity
{
private:
  entity category;
public:
//ctor
bool is_object() const{return category == entity_category::object;}
bool is_function() const{return category == entity_category::function;}
bool is_variable() const{return is_object() || (is_reference() && get_referent_category(category) == entity_category::object);}
entity_category get_category() const;
//other accessors
//...
};
//当然也可以不这么描述,用派生类表示各种具体的实体。反正一种语言的entity一共就这么些。

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
159 [报告]
发表于 2012-09-26 00:49 |只看该作者
本帖最后由 starwing83 于 2012-09-26 00:49 编辑

回复 157# wwwsq


    哼哼,你这套把戏我之前就看透了,你看我之间的回复,我记得在某个回复特地说了。你这个逻辑是不对的,实际上是做了类似二级指针的事情。你可以说24号是XX大厦,你当然可以说XX大厦是24号。这是完全合理合法的,但是如果你说XX大厦是24这个数字,你就做了“二次解释”了。这里没有二次解释的问题。标示符是表达式,标示符代表变量,这两个是一层的,参见类似《C专家编程》里面一个图:


  1.      标示符    ---是-->     表达式
  2.                              |
  3.                              ?
  4.                              |
  5.      标示符    --代表->     变量
复制代码
看到了么?表达式这个概念和变量这个概念是“平级”的,如同24号这个概念(而不是24这个数字)和XX大厦这个概念是平级的。如果你说XX大厦是24这个数字,就相当于说变量就是标示符,这明显是不对的。

现在就是在探讨这个平级关系,以上几个回帖都是在这个基础上讨论的。

论坛徽章:
0
160 [报告]
发表于 2012-09-26 00:56 |只看该作者
starwing83 发表于 2012-09-26 00:49
回复 157# wwwsq



表达式时候语法形式,变量是实体。一个实体怎么能是语法形式?就像一栋大楼怎么能是数字?

identifier是个符号,不是实体。当然可以是表达式。
变量是一个实体,怎么能是语法形式呢?

在学完variable的知识之后,你还需要学习语义学的知识。关于符号和实体的关系。
这算是语义学还是小学语文?也许没这么高深。你的小学语文是体育老师教的吗?



您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP