我不明白以下代码示例的作用以及它是如何做到的:
#include <stdio.h>
int f();
int a = f(); // a exists just to call f
int x = 22;
int f() {
++x;
return 123; // unimportant arbitrary number
}
int main() {
printf("%d\n", x);
}
Run Code Online (Sandbox Code Playgroud)
当它运行时它打印23,这是直观的答案.
但是在C++中,全局变量应该按照定义的顺序进行初始化.这意味着a之前应该初始化x,因为它是之前定义的x.如果是这种情况,则f必须在x初始化之前调用该函数,因为调用f是a定义的一部分.
如果f在x初始化之前确实被调用,那将意味着f会尝试增加x- 我不确定的结果(很可能是UB,或者某些乱码值).然后,在a初始化之后,x将初始化为22并且程序将打印出来22.
显然,这不是发生的事情.但是什么呢?该代码实际上做了什么?
它似乎x …
我正在学习Objective-C,并且拥有C/C++背景.
在面向对象的C++中,总是需要在定义(实现)它之前声明方法,即使它是在父类中声明的.
在过程式C,IIRC中,只要定义一个函数,只要从同一个编译单元中的其他东西(即同一个文件)调用它就可以远离文件中的某个函数(嗯,提供)你没有在其他地方用"extern"声明它.
现在,在Objective-C中,您似乎只需要在头文件中声明选择器,如果它们将被外部使用,并且您可以在.m文件中组合选择器就好了,并在其中调用它们.m文件.此外,似乎永远不会(重新)定义委托方法或继承的方法.
我是在正确的轨道上吗?什么时候需要在Objective-C中定义一个选择器?
当我第一次被介绍到CI被告知总是在函数的顶部声明我的变量.现在我对语言有了很强的把握,我将重点放在编码风格上,特别是限制了变量的范围.我已经阅读了限制范围的好处,我遇到了一个有趣的例子.显然,C99允许你这样做......
for (int i = 0; i < 10; i++)
{
puts("hello");
}
Run Code Online (Sandbox Code Playgroud)
我原以为一个变量的作用域是由最内层的限制周围的花括号{ },但在上面的例子中int i出现通过的,即使是他们的之外声明for循环的花括号中范围有限.
我试图扩展上面的例子fgets()来做我认为类似的东西,但这两个都给了我一个语法错误.
fgets(char fpath[80], 80, stdin);*见说明**
fgets(char* fpath = malloc(80), 80, stdin);
那么,在C99中声明变量的确切位置是合法的吗?for循环示例是规则的例外吗?这适用于while和do while循环吗?
*注意**:我甚至不确定这在语法上是否正确,即使我可以在那里声明char数组,因为fgets()它正在寻找指向char的指针而不是指向char 数组80的指针.这就是我尝试该malloc()版本的原因.
在C++中,可以分离函数的声明和定义.例如,声明一个函数是很正常的:
int Foo(int x);
Run Code Online (Sandbox Code Playgroud)
在Foo.h贯彻它Foo.cpp.是否有可能与lambdas做类似的事情?例如,定义一个
std::function<int(int)> bar;
Run Code Online (Sandbox Code Playgroud)
在以下内容中bar.h实现它bar.cpp:
std::function<int(int)> bar = [](int n)
{
if (n >= 5)
return n;
return n*(n + 1);
};
Run Code Online (Sandbox Code Playgroud)
免责声明:我在C#中有使用lambdas的经验,但我没有在C++中使用过它们.
为什么这段代码在C中工作但在C++中不工作?
int i = 5;
int i; // but if I write int i = 5; again I get error in C also
int main(){
// using i
}
Run Code Online (Sandbox Code Playgroud) 在使用$ error做某事之前:
$error = NULL;
Run Code Online (Sandbox Code Playgroud)
在某些剧本中看到:
$error = '';
$error = false;
$error = 0;
Run Code Online (Sandbox Code Playgroud)
作为NetBeans的狂热用户,我在引入新变量时不断获得拆分变量声明和赋值的建议.作为一个超级快速的例子,让我们采用这个Java系列:
String someInput = JOptionPane.showInputDialog(null, "- Enter something: ");
Run Code Online (Sandbox Code Playgroud)
与:
String someInput;
someInput = JOptionPane.showInputDialog(null, "- Enter something: ");
Run Code Online (Sandbox Code Playgroud)
NetBeans似乎更喜欢后者(但我不知道其他IDE).虽然它显然有两种方式,但如果有的话,这将被视为"良好做法"?或者纯粹是个人喜好?
(显然,拆分这两个意味着你可以只合并为一个额外的一条线,但那就是重点.)
我如何理解以下复杂的声明?
char (*(*f())[])();
char (*(*X[3])())[5];
void (*f)(int,void (*)());
char far *far *ptr;
typedef void (*pfun)(int,float);
int **(*f)(int**,int**(*)(int **,int **));
Run Code Online (Sandbox Code Playgroud) 我收到以下错误:
ISO C++禁止声明ttTreeInsert没有类型
ISO C++禁止在没有类型的情况下声明ttTreeDelete
ISO C++禁止在没有类型的情况下声明ttTreePrint
int ttTree的原型:: ttTreePrint()与类ttTree中的任何一个都不匹配
候选人是:void ttTree :: ttTreePrint()
这是我的头文件:
#ifndef ttTree_h
#define ttTree_h
class ttTree
{
public:
ttTree(void);
int ttTreeInsert(int value);
int ttTreeDelete(int value);
void ttTreePrint(void);
};
#endif
Run Code Online (Sandbox Code Playgroud)
这是我的.cpp文件:
#include "ttTree.h"
ttTree::ttTree(void)
{
}
ttTree::ttTreeInsert(int value)
{
}
ttTree::ttTreeDelete(int value)
{
}
ttTree::ttTreePrint(void)
{
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以指出导致这些错误的原因吗?谢谢!
以下语法有效:
while (int i = get_data())
{
}
Run Code Online (Sandbox Code Playgroud)
但以下不是:
do
{
} while (int i = get_data());
Run Code Online (Sandbox Code Playgroud)
我们可以通过标准草案N4140第6.4节了解原因:
1 [...]
condition: expression attribute-specifier-seqopt decl-specifier-seq declarator = initializer-clause attribute-specifier-seqopt decl-specifier-seq declarator braced-init-list2条件规则既适用于选择陈述,也适用于
for和while陈述(6.5).[...]
和第6.5节
1迭代语句指定循环.
iteration-statement:while( condition ) statementdostatementwhile( expression ) ;
相反,你被迫做一些丑陋的事情:
int i = get_data();
do
{
} while ((i = get_data())); // double parentheses sic
Run Code Online (Sandbox Code Playgroud)
这是什么理由?
declaration ×10
c++ ×5
variables ×4
c ×3
definition ×3
api-design ×1
c++11 ×1
class ×1
constructor ×1
do-while ×1
function ×1
java ×1
lambda ×1
objective-c ×1
php ×1
pointers ×1