为什么以下用C++编译?
int phew = 53;
++++++++++phew ;
Run Code Online (Sandbox Code Playgroud)
相同的代码在C中失败,为什么?
我不明白输出(" four")是怎么来的?
$a = 2;
echo
$a == 1 ? 'one' :
$a == 2 ? 'two' :
$a == 3 ? 'three' :
$a == 5 ? 'four' :
'other'
;
// prints 'four'
Run Code Online (Sandbox Code Playgroud)
我不明白为什么" four"被打印出来.
谁喜欢告诉我这段代码有什么问题(语法上)?
-- merge two sorted lists
mergeX [] b res = b ++ res
mergeX a [] res = a ++ res
mergeX a:as b:bs res
| a > b = mergeX as b:bs a:res
| otherwise = mergeX a:as bs b:res
Run Code Online (Sandbox Code Playgroud)
解释:
解析模式中的错误:mergeX
TypeOperators启用语言扩展后,可以定义自己的类型运算符.此外,可以设置它们的相对优先级infix*.但是(->),例如,优先权是什么?
> :i (->)
data (->) a b -- Defined in `GHC.Prim'
instance Monad ((->) r) -- Defined in `GHC.Base'
instance Functor ((->) r) -- Defined in `GHC.Base'
instance Applicative ((->) a) -- Defined in `Control.Applicative'
instance Arrow (->) -- Defined in `Control.Arrow'
instance Monoid b => Monoid (a -> b) -- Defined in `Data.Monoid'
instance ArrowLoop (->) -- Defined in `Control.Arrow'
instance ArrowChoice (->) -- Defined in `Control.Arrow'
instance ArrowApply (->) -- Defined in …Run Code Online (Sandbox Code Playgroud) map<int, int> mp;
printf("%d ", mp.size());
mp[10]=mp.size();
printf("%d\n", mp[10]);
Run Code Online (Sandbox Code Playgroud)
此代码产生的答案不是很直观:
0 1
我理解为什么会发生这种情况 - 赋值的左侧返回对mp[10]底层值的引用,同时创建上述值,然后使用新计算size()的映射来评估右侧.
这种行为在C++标准中是否有任何说明?或者评估顺序是否未定义?
使用g ++ 5.2.1获得结果.
这很好:
def foo
a or b
end
Run Code Online (Sandbox Code Playgroud)
这也没关系:
def foo
return a || b
end
Run Code Online (Sandbox Code Playgroud)
返回void value expression:
def foo
return a or b
end
Run Code Online (Sandbox Code Playgroud)
为什么?它甚至没有被执行; 它没有通过语法检查.什么void value expression意思?
int x = 5,y = 10;
bool boolean = 0;
int k = (boolean ? ++x, ++y : --x, --y);
cout<<k;
Run Code Online (Sandbox Code Playgroud)
当布尔值为0时,它输出9,但是当它为1时输出10.我知道这是因为优先级而发生,但无法准确弄清楚它是如何发生的,请帮助我理解这一点.
注意:我知道如果我使用括号,我可以获得预期的输出,或者更好地编写一个干净的代码,我只是用它来理解编译器如何根据优先级来评估这些表达式.
seq功能文档说明如下:
关于评估顺序的注释:表达式
seq a b不保证a将在之前进行评估b.给出的唯一保证seq是,既a和b会前进行评估seq返回一个值.特别是,这意味着b可以在之前进行评估a.如果需要保证特定的评估顺序,则必须使用pseq"并行"软件包中的功能.
所以我有一个sum带累加器的懒函数:
sum :: Num a => [a] -> a
sum = go 0
where
go acc [] = acc
go acc (x:xs) = go (x + acc) xs
Run Code Online (Sandbox Code Playgroud)
显然,这在大名单上非常缓慢.现在我用seq以下方法重写这个函数:
sum :: Num a => [a] -> a
sum = go 0
where
go acc [] = acc
go acc (x:xs) = …Run Code Online (Sandbox Code Playgroud) 这段代码
int a = 6;
System.out.print("The result is " + a*a);
Run Code Online (Sandbox Code Playgroud)
工作得很好,但这一个
int a = 6;
System.out.print("The result is " + a^a);
Run Code Online (Sandbox Code Playgroud)
产生例外:
线程"main"中的异常java.lang.RuntimeException:无法编译的源代码 - 错误的树类型:at pkg1.pkg4.taking.input.TakingInput.main(TakingInput.java:11)
为什么这样?
当我试图一次性打印几个按位操作的结果时出现了这个问题,如下所示:
System.out.print(a&b + "\n" + a|b + "\n" + a^b);
Run Code Online (Sandbox Code Playgroud)
我查看了print()方法的描述和关于按位运算符的几个主题以及在SO上打印到控制台,包括编写问题时的推荐主题,但找不到答案.
JLS:
的最低优先级操作者是lambda表达式的箭头( - >) ,随后由赋值运算符。
遵循哪个方向(增加优先级,减少优先级)?-“跟随”是指分配的优先级较高还是较低(相对于箭头运算符)?我猜想,这是因为“最低”(箭头)表示绝对最低。
据我了解,箭头(->)应该位于此Princeton运算符优先级表的最底部(在所有赋值运算符的下方),因此箭头(->)的优先级为0(零)(根据该表)。
我的理解正确吗?
ExamTray似乎说箭头优先级至少与分配相同。此外,还阐明了箭头的关联性是Left-> To-> Right(与分配不同)。我没有找到JLS的箭头关联性报价。
我一直认为分配优先级原则上最低。
java specifications operator-precedence language-lawyer java-8