我试图动态创建一个常量名称,然后获取该值.
define( CONSTANT_1 , "Some value" ) ;
// try to use it dynamically ...
$constant_number = 1 ;
$constant_name = ("CONSTANT_" . $constant_number) ;
// try to assign the constant value to a variable...
$constant_value = $constant_name;
Run Code Online (Sandbox Code Playgroud)
但是我发现$ constant值仍然包含常量的NAME,而不是VALUE.
我也尝试了第二级间接$$constant_name
但是这会使它变量而不是常量.
有人可以对此有所了解吗?
我正在读" Bash初学者指南 ".它说:
如果第一个字符
PARAMETER
是感叹号,则Bash使用由其余部分形成的变量的值作为变量PARAMETER
的名称; 然后展开此变量,并将该值用于替换的其余部分,而不是其PARAMETER
自身的值.这被称为间接扩张.
给出的例子是:
Run Code Online (Sandbox Code Playgroud)franky ~> echo ${!N*} NNTPPORT NNTPSERVER NPX_PLUGIN_PATH
我在这里不太明白:
从其余部分形成的变量的值
PARAMETER
由于PARAMETER
是刚刚!N*
的话
其余的
PARAMETER
只是N*
.怎么会形成一个变量?Bash在那里搜索了所有可能的命令吗?
引用"间接水平解决每个问题"的含义在计算机科学中意味着什么?
我在一本书中读过这句话:
计算机科学中没有任何问题无法使用另一层次的间接解决.
有人可以解释一下吗?"间接水平"是什么意思?
根据我的理解,间接是使用值的指针而不是值本身的奇特名称.请为我澄清一下.
有没有办法在yaml中使用占位符,如下所示:
foo: &FOO
<<propname>>:
type: number
default: <<default>>
bar:
- *FOO
propname: "some_prop"
default: "some default"
Run Code Online (Sandbox Code Playgroud) 我正在玩,gcc
并尝试了以下一些代码:
int A = 42;
int *B = &A;
int *C = &*B;
Run Code Online (Sandbox Code Playgroud)
并且C == &A
,正如所料.但是当我尝试:
int *B = NULL;
int *C = &*B;
Run Code Online (Sandbox Code Playgroud)
原来C == NULL
,没有段错误.因此,在获取其地址之前&*B
实际上并未解除引用B
.
我的猜测是预处理器剥离出来的情况下,&*
和*&
之前,他们甚至得到了编译器,因为他们否定对方,但我无法找到任何文件,以验证这是否是标准ç或编译器特定的.
被预处理器剥离出来&*
,并*&
和我可以期待从任何给定的编译器这种行为?
我无法理解UNPACK
Haskell的工作原理.例如,考虑以下数据声明:
data P a b = P !a !b
data T = T {-# UNPACK #-} !(P Int Int)
Run Code Online (Sandbox Code Playgroud)
如何T
解压缩数据类型?它会等同于
data T' = T' !Int !Int
Run Code Online (Sandbox Code Playgroud)
或将Int
进一步解压缩:
data T'' = T'' Int# Int#
Run Code Online (Sandbox Code Playgroud)
?关于什么
data U = U {-# UNPACK #-} !(P Int (P Int Int))
Run Code Online (Sandbox Code Playgroud)
?
如何使此代码有效?
#!/bin/bash
ARRAYNAME='FRUITS'
FRUITS=( APPLE BANANA ORANGE )
for FRUIT in ${!ARRAYNAME[@]}
do
echo ${FRUIT}
done
Run Code Online (Sandbox Code Playgroud)
这段代码:
echo ${!ARRAYNAME[0]}
Run Code Online (Sandbox Code Playgroud)
打印APPLE.我尝试做类似的事情,但用"[@]"迭代数组.
提前致谢,
TL; DR
给出以下代码:
int* ptr;
*ptr = 0;
Run Code Online (Sandbox Code Playgroud)
在应用间接之前,是否*ptr
需要进行左值到右值的转换ptr
?
该标准涵盖了许多地方的左值到左值的主题,但似乎没有指定足够的信息来确定*运算符是否需要这样的转换.
细节
在左值到右值的转换是覆盖在N3485的部分4.1
左值到右值转换段落1和说(重点矿山前进):
可以将非函数非数组类型T的glvalue(3.10)转换为prvalue.53如果T是不完整类型,则需要进行此转换的程序是错误的.如果glvalue引用的对象不是T类型的对象,并且不是从T派生的类型的对象,或者如果该对象未初始化,则需要此转换的程序具有未定义的行为.[...]
那么*ptr = 0;
转换需要吗?
如果我们转到4
第1节,它说:
[...] 如果需要,标准转换序列将应用于表达式 ,以将其转换为所需的目标类型.
那么什么时候需要呢?如果我们看一下5
表达式,第9段中提到了左值到右值的转换,它说:
每当glvalue表达式作为操作符的操作数出现时,该操作符需要该操作数的prvalue,左值到右值(4.1),数组到指针(4.2)或函数到指针(4.3)标准转换是用于将表达式转换为prvalue.[...]
和第11段说:
在某些情况下,表达式仅出现其副作用.这样的表达式称为丢弃值表达式.[...]当且仅当表达式是volatile限定类型的左值并且它是以下之一时,才应用左值到右值转换(4.1). ...]
两段似乎都不适用于此代码示例和5.3.1
一元运算符第1段它说:
一元*运算符执行间接:它所应用的表达式应该是指向对象类型的指针,或指向函数类型的指针,结果是指向表达式指向的对象或函数的左值.如果表达式的类型是"指向T的指针",则结果的类型为"T".[注意:通过指向不完整类型(cv void除外)的指向的间接有效.由此获得的左值可以以有限的方式使用(例如,初始化参考); 这个左值不能转换为prvalue,见4.1. - …
当声明在C指针,有2个(编辑:3)的变体:
变式A:
__CODE__
变式B:
__CODE__
变式C:
__CODE__
声明指针的方式因我阅读的文档类型而异.一些作者似乎偏好某些变体,其他人使用几种变体.
indirection ×10
bash ×2
c ×2
pointers ×2
abstraction ×1
addressof ×1
c++ ×1
constants ×1
declaration ×1
haskell ×1
php ×1
scripting ×1
standards ×1
yaml ×1