正如标题所暗示的那样,之前已经提出了这个问题.但是,答案与C++ 03/0x(11)有关.C++ 11(N3337)对变量说了这个:
甲变量是由比非静态数据成员或对象的其他的基准的声明引入.变量的名称表示引用或对象.
这可能意味着变量本质上是命名对象/引用.
变量的名称(如果有)表示引用或对象.
这意味着一个变量并没有必然有一个名字.
对第一句的不同解释可以表明变量是名称,因为表示对象/引用的名称也由这些实体的声明引入.但第二句与"变量名"这一概念相矛盾.那么,变量现在只是对象和引用的上位词,无论是否命名?
通过函数类型与被调用函数定义的函数类型不同的表达式调用函数会导致未定义行为。
void f() noexcept {}; // function type is "noexcept function"
void (*pf)() = f; // variable type is "pointer to function"; initialized by result of [conv.fctptr]([conv.func](f))
int main()
{
(*pf)(); // `*pf`: lvalue expression's function type is "function" (without noexcept!)
}
Run Code Online (Sandbox Code Playgroud)
根据引用的标准,上述调用是否会导致未定义的行为?
c++ function-pointers undefined-behavior language-lawyer noexcept
在我的桌面上,有一个名为"test"的文件夹.在这个文件夹里面有两个文件,"file1.txt"和"file2.txt".
看看这个简单的批处理脚本:
@ECHO OFF
SET test="C:\Users\Tyler\Desktop\test"
ECHO %test%
FOR /R %test% %%F IN (*) DO (
ECHO %%F
)
Run Code Online (Sandbox Code Playgroud)
正如您所料,它输出以下内容:
"C:\Users\Tyler\Desktop\test"
C:\Users\Tyler\Desktop\test\file1.txt
C:\Users\Tyler\Desktop\test\file2.txt
Run Code Online (Sandbox Code Playgroud)
现在来看看这个变化:
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET test="C:\Users\Tyler\Desktop\test"
ECHO !test!
FOR /R !test! %%F IN (*) DO (
ECHO %%F
)
ENDLOCAL
Run Code Online (Sandbox Code Playgroud)
我希望它的输出没有什么不同.但是,这里是:
"C:\Users\Tyler\Desktop\test"
Run Code Online (Sandbox Code Playgroud)
它似乎在线上!test!
扩展ECHO !test!
,但不FOR /R !test!
在线,变得公正!test!
.因为那当然不是有效路径,FOR/R循环永远不会迭代.
为什么是这样?我错过了什么?