标题:关于三元运算符的疑问
只看楼主
wenxinwukui
Rank: 1
等 级:新手上路
帖 子:22
专家分:6
注 册:2010-11-15
得分:0 
哦,我看到的是thinking in c++ 的关于编译时编程部分的“编译时选择”的一个例子,例子是这样的:
#include <iostream>
using namespace std;

template<int n1, int n2> struct Max{
    enum{ val = n1 > n2 ? n1: n2 };
};
int main(){
    cout << Max<10, 20> :: val << endl; //20
}
因为enum相当于一个常量,所以不用分配内存在编译时就可以确定值,但是从这看起来好像三元运算符在编译时就已经知道它的值了。请各位指教。
2010-12-03 10:54
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
得分:0 
你自己看书唄,书上会给这代码,不会没有解释的。

我举个例子,你写:
int a = 2*3;
你认为a的值是不确定的,在运行时计算出来,还是编译时就确定为6?但这不能说乘法是一个在编译时计算的运算。

从语言学的角度来看,这个问题属于表达式的一类特殊的情况,叫常量表达式(Constant expressions)。也就是说,虽然你写了一个 2*3,但在语义上,我们不认为它是一个 算术表达式。

我举的这种情况,一般人很少会感到困惑。你那个之所以比较复杂,是因为又用了模版参数。那个有专门的静态推导的語法,相关的語法条目是非常多的,说起来太多了,不过理解起来倒是不难。总得来说,一个意思,由于其它的語法限制,那个条件表达式一定在语义上是常量表达式。


我认为实际编程中不应该用类似那样的語法,而且实际我也从没在阅读别人的源码时见过。

不过 thinking in c++ 是本名书。它这么写应该有它的理由吧,肯定会在上下文中给出具体的说明的(也许也包括在什么情况下应该用这东西)。楼主仔细研究一下,回头把研究結果发表上来,我们也好学学~~
2010-12-03 23:02
南国利剑
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:29
帖 子:1165
专家分:3536
注 册:2010-4-12
得分:0 
本人还是坚持在运行时确定。

南国利剑
2010-12-03 23:21
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
得分:0 
楼主后来问的根本就不是那个运算符什么时候算的问题。
如果这个要是运行时算的话,那楼主后来给的那个代码都解释不通了。

而且这没什么坚持不坚持的,学语言不应该执着于这些。语言本身只规定应该是什么結果,没规定应该如何实现。
2010-12-04 19:40
wenxinwukui
Rank: 1
等 级:新手上路
帖 子:22
专家分:6
注 册:2010-11-15
得分:0 
谢谢楼上几位,让我受益匪浅,谢谢。
2010-12-05 13:50



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-326748-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024921 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved