刚刚在ISO/IEC9899中找到了一些东西我偶然发现了这个:
6.7.6类型名称
[...]
语义
2在几种情况下,有必要指定一种类型.这是使用类型名称完成的,类型名称在语法上是函数的声明或省略标识符的该类型的对象.128)3示例构造
(a) int
(b) int *
(c) int *[3]
(d) int (*)[3]
(e) int (*)[*]
(f) int *()
(g) int (*)(void)
(h) int (*const [])(unsigned int, ...)
Run Code Online (Sandbox Code Playgroud)
name分别命名为(a)int,(b)指向int的指针,(c)指向int的三个指针的数组,(d)指向三个int的数组的指针,(e)指向未指定数字的可变长度数组的指针oft,(f)没有参数规范的函数返回指向int的指针,(g)指向函数的指针,没有返回int的参数,以及(h)指向函数的未指定数量的常量指针的数组,每个指针都有一个参数具有unsigned int类型和未指定数量的其他参数,返回int.
让我最困惑的是:
(e)指向未指定数量的整数的可变长度数组的指针
我可以或多或少地了解其他人.但是指向未指定数量的'整数'的VLA的指针有什么用?
甚至还需要编译器来支持语法
int foo[*];
Run Code Online (Sandbox Code Playgroud)
?
编辑澄清
本课题主要针对"是否有必要为编译器提供支持?".虽然这篇文章ANSI-C语法 - 像[*] et alii这样的数组声明明显提高了我的知识.仍然没有答案:为什么编译器需要知道原型的参数是否是包含未知大小的地址.只是简单地做int foo[]或者它将是未指定的大小?
那么真的有必要得到支持吗?如果不是这样,那为什么标准甚至会实现这种语义呢?
这是明确定义的行为还是未定义/以其他方式定义哪些foo(数据类型或标识符)sizeof将在哪些操作?
typedef int foo;
int main(int argc, char *argv[])
{
char foo;
printf ("%u\r\n", sizeof(foo));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果它定义得很好,有没有办法可以获得数据类型的大小foo而不声明该类型的变量只sizeof在其上使用?
前段时间没有站在这样的线路之后:
if (arg)
invk(test);
else if (test)
{
alot();
stuff();
}
Run Code Online (Sandbox Code Playgroud)
我决定在1920x1200次中为自己提供更好的可读性,而不是省略{}.
所以我写了一个工具来重新格式化我现有的代码.
后来我注意到该工具中的一个错误
if (x)
{
...
}
else if(y)
{
...
}
else if(z)
{
...
}
Run Code Online (Sandbox Code Playgroud)
已被改变(不明显地改变行为)成:
if (x)
{
...
}
else
{
if(y)
{
...
}
else
{
if(z)
{
...
}
}
}
Run Code Online (Sandbox Code Playgroud)
这让我意识到(无意)这实际上是else if通过C的语法和语义规则做的事情.
那么,有没有甚至像一个陈述else if()现有或只是语义的滥用的结果在这个有用的,但(让我们称之为它,以便用于此目的)混淆起源措辞,打破任何格式化规则,只是作为人类可读?
这是我的代码:
void MainWindow::on_actionOpen_Image_triggered()
{
QString fileName = QFileDialog::getOpenFileName(this,"Open Image File",QDir::currentPath());
if(!fileName.isEmpty())
{
QImage image(fileName);
if(image.isNull())
{
QMessageBox::information(this,"Image Viewer","Error Displaying image");
return;
}
QGraphicsScene scene;
QGraphicsView view(&scene);
QGraphicsPixmapItem item(QPixmap::fromImage(image));
scene.addItem(&item);
view.show();
}
Run Code Online (Sandbox Code Playgroud)
}
我想从文件显示图像,代码工作正常,但图像的速度非常快.
如何暂停图像屏幕?
如何在"graphicsView"小部件中加载图像?
我的代码:
void MainWindow::on_actionOpen_Image_triggered()
{
QString fileName = QFileDialog::getOpenFileName(this,"Open Image File",QDir::currentPath());
if(!fileName.isEmpty())
{
QImage image(fileName);
if(image.isNull())
{
QMessageBox::information(this,"Image Viewer","Error Displaying image");
return;
}
QGraphicsScene scene;
QGraphicsPixmapItem item(QPixmap::fromImage(image));
scene.addItem(&item);
ui->graphicsView->setScene(&scene);
ui->graphicsView->show();
}
}
Run Code Online (Sandbox Code Playgroud)
这是行不通的.
如何解决这个问题?
在我的学徒生涯中,我们现在开始在学校学习 vba。当老师向我们分发数据类型摘要时,我有点困惑。……
布尔值 -> 2 字节 -> 范围:True / False
嗯True/False当然是合理的,但是,为什么使用 2 个字节,因为布尔值必须能够表示 2 个值中的任何一个?我的意思是理论上我们可以使用单个位来表示该范围内的任何值。(但我知道这是没有意义的,因为我们使用的是高级语言)
当我问我的老师这个问题时,他表现得好像他从来没有问过自己同样的问题,经过几秒钟的沉思,他只是用这样的答案结束了这句话:“你必须接受它,因为它是什么,它是什么?”是。” 但如果我只是“使用”,并且永远不会对理解感兴趣,那么我不会称自己为优秀的程序员。所以我现在在这里问:
vba中是否有任何原因,为什么Boolean需要2个字节而不是单个字节?
#include <stdio.h>
void test(int arr[]);
int main ()
{
int *arr[3];
int ar1[2] = { 1, 2 };
int ar2[3] = { 3, 4, 5 };
int vla[ar2[1]];
arr[0] = ar1;
arr[1] = ar2;
arr[2] = vla;
for (int i = 0; i < 3; i++)
{
test(arr[i]);
}
}
void test(int arr[])
{
printf("%zu\r\n", sizeof(arr));
}
Run Code Online (Sandbox Code Playgroud)
正如标题所说:这是有效的吗?如果是这样,有没有办法test()通过使用sizeof像数组一样输入的函数参数来输出不同的值?
我是现在公司的新成员,正在研究由我的直接团队负责人撰写的项目.该公司通常不使用C++,但我的同事用C/C++编写了高效的代码.只有我们知道如何用C++编写代码(我和我的领导,所以没有第三种意见可以参与).
在我对项目有足够的了解之后,我意识到整个结构都是...... 特别的.
它实际上由一个编译单元组成,其中makefile列为唯一的源代码main.hpp.
然后,此头文件包含项目所包含的所有源文件,因此它看起来像一个非常大的列表:
#include "foo.cpp"
#include "bar.cpp"
Run Code Online (Sandbox Code Playgroud)
在尝试理解它背后的逻辑时,我意识到这确实适用于这个项目,因为它只是一个接口,每个单元可以在不访问任何其他单元的情况下运行,在某些时候我问他为什么这样做的原因是什么这条路.
我对这个论点采取了防御性的反应
嗯,它有效,不是吗?如果您认为对您更好,您可以自由地按照自己的方式行事.
这就是我现在正在做的事情,仅仅因为我在思考这个结构时遇到了麻烦.所以现在我将"通常"结构应用到我现在正在编写的实现中,同时只对整个项目进行必要的更改,以演示我将如何设计它.
我认为存在许多缺点,从混合链接器和编译器开始,通过自己的项目结构工作不能很好地服务,直到优化可能以冗余或模糊的结果结束,更不用说项目的干净构建需要大约30分钟,我认为可能也是由结构引起的.但我缺乏知名度的知识,而不仅仅是假设的问题.
而他的论点是"它按我的方式工作,不是吗?" 是的,我希望能够向他解释为什么这是一个坏主意,而不是作为新的挑剔的家伙过来.
那么这样的项目结构究竟会导致什么问题呢?或者我反应过度,这样的结构完全没问题?
C标准禁止转入存在VLA的功能范围.
VLA和对alloca函数的调用应该在低级别上具有相同的结果.
(我可能是错的,因为我只是一个C,而不是一个低级程序员,但在我的想象中,似乎很机智)
那么下面的代码片段也会是未定义的行为吗?
int main()
{
char *p;
goto label1;
{
p = _alloca(1);
label1:
p = NULL;
}
}
Run Code Online (Sandbox Code Playgroud)
当然我不能参考p,但是关于这种行为是什么?
当我问他什么时,这个问题的作者对我很开心
sizeof * q......他告诉我这是一个非常基本的C问题,我应该检查一下.但是当我环顾四周并且之前没有见过某人问过时,我现在就自己做了:
sizeof在没有括号和/或类型的情况下使用C时会做什么?
在这篇文章中,OP包含有很多错误的代码,但是1行让我特别好奇,因为我无法查看任何东西,不允许它.这是具体的一行:
int n = 100000, arr[n];
Run Code Online (Sandbox Code Playgroud)
是否确保了声明和初始化的顺序?
所以在这里我会假设它甚至可能发生n在arr获得声明时没有被初始化,看起来很不好.
但是我无法在iso/iec 9899草案中找到任何关于此的陈述,既没有说明未定义也没有定义它.
这是因为我假设未定义的行为?或者是吗?
无论哪种方式,该结果适用的规则是什么?5
编辑:
这对C99也有效吗?