注册 登录
编程论坛 C++教室

关于三元运算符的疑问

wenxinwukui 发布于 2010-11-24 15:46, 2263 次点击
各位请问一下,三元运算符是在编译的时候已经赋值了还是在运行的时候才赋值?也就是如下:
int i = 10;
int a = i<20?1:2;
请问编译后a的值是不是已经确定了?
14 回复
#2
xanxus2010-11-24 15:56
运行的时候才赋值吧
#3
玩出来的代码2010-11-24 18:49
a的值是到运行时才能知道的。若i的定义为const int i=10;那么表达式的值会在编译器确定,但是a的值还是在运行时才确定。
#4
木头lbj2010-11-24 22:47
运行的时候吧   应该是。。。
#5
pangding2010-11-24 23:09
一般是运行时。

但如果有些条件可以在编译时确实,编译器就有可能会优化。比如
if (a != 1 || a != 2) {}
这种条件,gcc 开优化时会去掉条件判断,直接执行 {} 中的部分。同时会给个警告。

关于优化的问题,不仅不同的编译器做法不一样。就是同一个编译器的不同版本也可能会有不同的处理方式。有时不用太拘泥于细节。
#6
南国利剑2010-11-25 01:04
回复 楼主 wenxinwukui
一般是在运行的时候才能够确定。
但是,有的功能比较强大编译器,可能会在一些条件下自动就确定了。
#7
南国利剑2010-11-25 01:07
欢迎各位高手来发表看法!
#8
shi198719872010-11-25 18:12
这个应该是运行时候吧!
#9
秀痘魔导士2010-11-26 15:34
编译的时候程序都没有运行,内存也没有分配,谈什么确定不确定的。
#10
南国利剑2010-11-27 23:18
偏向同意楼上的观点!
#11
wenxinwukui2010-12-03 10:54
哦,我看到的是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相当于一个常量,所以不用分配内存在编译时就可以确定值,但是从这看起来好像三元运算符在编译时就已经知道它的值了。请各位指教。
#12
pangding2010-12-03 23:02
你自己看书唄,书上会给这代码,不会没有解释的。

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

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

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


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

不过 thinking in c++ 是本名书。它这么写应该有它的理由吧,肯定会在上下文中给出具体的说明的(也许也包括在什么情况下应该用这东西)。楼主仔细研究一下,回头把研究結果发表上来,我们也好学学~~
#13
南国利剑2010-12-03 23:21
本人还是坚持在运行时确定。
#14
pangding2010-12-04 19:40
楼主后来问的根本就不是那个运算符什么时候算的问题。
如果这个要是运行时算的话,那楼主后来给的那个代码都解释不通了。

而且这没什么坚持不坚持的,学语言不应该执着于这些。语言本身只规定应该是什么結果,没规定应该如何实现。
#15
wenxinwukui2010-12-05 13:50
谢谢楼上几位,让我受益匪浅,谢谢。
1