小编Art*_*tur的帖子

两个相邻的##运算符

有人可以解释为什么2个连接运算符不会由预处理器产生任何错误吗?:

#define Z(x) x ## ## 3
Z(3)
Run Code Online (Sandbox Code Playgroud)

结果是:

33
Run Code Online (Sandbox Code Playgroud)

标准说:

...删除替换列表中的##预处理标记的每个实例(不是来自参数),并将前面的预处理标记与以下预处理标记连接在一起

所以我希望preprocesor首先尝试连接x第二个##看起来很奇怪的东西.这不会产生任何有效的令牌,所以我希望至少有一个警告.gcc和VC都没有发出任何警告.

我会很感激这是如何工作的原因和原因.标准提到了placemaker临时代币,这可以解释为什么这样做有效,但两个'双锐利'之间必须有一个这样的标记.问题是placemaker当参数不包含令牌且两个concat运算符之间没有参数时,会生成令牌.

c c++ c-preprocessor

13
推荐指数
1
解决办法
326
查看次数

mysql auto_increment列以随机值递增

今天我遇到了一个我见过的MySQL最奇怪的东西.我有一个简单的表:

CREATE TABLE `features`
(
  `feature_id` mediumint(6) unsigned NOT NULL AUTO_INCREMENT,
  `feature_name` varchar(100) CHARACTER SET latin1 COLLATE latin1_general_cs NOT NULL,
  PRIMARY KEY (`feature_id`),
  UNIQUE KEY `feature_name_key` (`feature_name`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
Run Code Online (Sandbox Code Playgroud)

我在Java和mysql-connector-java-5.1.15库中插入数据.feature_name中的数据可能重复,我只想要唯一的值.我可以使用INSERT IGNORE但是如果数据太长我可能会忽略它所以我使用它:

pstmt = conn.prepareStatement( 
        "INSERT INTO features (feature_name) VALUES (?)" );

for ( String featureName: data4db.keySet() )
{
    pstmt.setString(1, featureName );

    try
    {
        pstmt.executeUpdate();
    }
    catch ( SQLException se )
    {
        if ( se.getErrorCode() == 1062 ) // duplicate entry
        {
            continue; // ignore
        }

        throw …
Run Code Online (Sandbox Code Playgroud)

mysql sql auto-increment

8
推荐指数
1
解决办法
3491
查看次数

为什么C/C++预处理器在这里添加空格?

我的预处理器有一个小问题困扰我,我在文档/预处理器/语言规范中找不到任何解释.

#define booboo() aaa
booboo()bbb
booboo().bbb
Run Code Online (Sandbox Code Playgroud)

被预处理成:

aaa bbb   <--- why is space added here
aaa.bbb
Run Code Online (Sandbox Code Playgroud)

处理三字符,连续行和注释后,预处理器处理预处理器指令并将输入分为预处理标记和空格.booboo的替换列表包含一个pp标记,它是标识符'aaa'.booboo()bbb分为pp-tokens:'booboo','(',')','bbb'.'booboo','(',')'的序列被识别为功能宏调用,它应该扩展为'aaa',输出中的imho应该看起来像'aaabbb'.我说过看起来像是 - 对于人类 - 它看起来像一个标记,而编译器将获得2个令牌'aaa'和'bbb',因为没有使用允许pp-token连接的'##'运算符.当'booboo().bbb'导致'aaa.bbb'没有空格时,为什么/什么规则使得cpp(c预处理器)在'aaa'和'bbb'之间放置额外的空格?

这是因为cpp试图使输出(主要是针对人类)是不连续的吗?人类无法分辨出'aaabbb'是由2个令牌组成的,因为它只能看到令牌的拼写.我对吗?我已经阅读了关于预处理器和gcc的cpp文档的C99文档.我什么也看不见.

如果我是对的,我们在这里有类似的情况:

#define baba() +
baba()+
baba()-
Run Code Online (Sandbox Code Playgroud)

结果是:

+ +
+-
Run Code Online (Sandbox Code Playgroud)

否则(如果'++'是输出)它会看起来像'++'令牌,但会有2个令牌'+'和'+'.是否与'##'运算符一样,cpp检查串联是否产生有效令牌但是在显示的情况下想要阻止人类执行串联?'+ - '不含糊,因此没有添加空格

c c++ c-preprocessor

8
推荐指数
1
解决办法
768
查看次数

为什么要担心签名类型的"未定义行为"?

我的问题与问题有关,并且几乎没有问题.

对我来说最明显的(意味着我会在我的代码中使用它)解决上述问题就是这样:

uint8_t x = some value;
x = (int8_t)x >> 7;
Run Code Online (Sandbox Code Playgroud)

是的,是的,我听到你们所有人......未定义的行为,这就是为什么我没有发布我的"解决方案".

我有一种感觉(也许只是我生病的头脑),术语"未定义的行为"在SO上被过度使用,只是为了证明如果问题被标记为c/c ++,那么就可以为某人辩护.

所以 - 让我们(暂时)抛开C/C++标准,思考日常生活/编程,真正的编译器实现以及它们为现代硬件生成的代码.

考虑到以下因素:

  • 据我所知,我遇到的所有硬件都有不同的算术和逻辑移位指令.
  • 我所知道的所有编译器都转换>>为有符号类型的算术移位和无符号类型的逻辑移位.
  • 我不记得任何编译器在c/c ++代码中使用div时发出类似于低级别的指令>>(我们在这里不讨论运算符重载).
  • 我所知道的所有硬件都使用U2.

所以...有什么(任何当代编译器,硬件)的行为与上面提到的不同?简单地说,我是否应该担心右移有符号值而不是转换为算术移位?

我的"解决方案"仅在许多平台上编译为一个低级指令,而其他平台则需要多个低级指令.你会在代码中使用什么?

请真相;-)

c c++ hardware bit-manipulation undefined-behavior

6
推荐指数
1
解决办法
285
查看次数

为什么sizeof()编译器返回的值依赖?

struct A
{
    char c;
    double d;
} a;
Run Code Online (Sandbox Code Playgroud)
  • 在mingw32-gcc.exe中: sizeof a = 16
  • 在gcc 4.6.3(ubuntu)中: sizeof a = 12

为什么他们不同?我认为它应该是16,gcc4.6.3是否做了一些优化?

c c++ sizeof

5
推荐指数
2
解决办法
559
查看次数

为什么编译器允许你在这里"写"一个const变量?

为什么你这样欺骗编译器:

const int a = 5;
*((int*)&a)=5;   // VC/armcc does not complain
Run Code Online (Sandbox Code Playgroud)

当上面的"删节"相当于此:

const int *ptr2const = &a;
int *ptr = ptr2const;      // as expected error is raised here
*ptr = 5;
Run Code Online (Sandbox Code Playgroud)

c c++ pointers const

3
推荐指数
2
解决办法
1215
查看次数

C++整型常量的类型

根据MSDN(整数类型 - VC2008):

没有后缀的十进制常量的类型是int,long int或unsigned long int.可以表示常量值的这三种类型中的第一种是分配给常量的类型.

Visual C++ 2008上运行以下代码:

void verify_type(int a){printf("int [%i/%#x]\n", a, a);}
void verify_type(unsigned int a){printf("uint [%u/%#x]\n", a, a);}
void verify_type(long a){printf("long [%li/%#lx]\n", a, a);}
void verify_type(unsigned long a){printf("ulong [%lu/%#lx]\n", a, a);}
void verify_type(long long a){printf("long long [%lli/%#llx]\n", a, a);}
void verify_type(unsigned long long a){printf("unsigned long long [%llu/%#llx]\n", a, a);}

int _tmain(int argc, _TCHAR* argv[])
{
    printf("sizeof(int) %i\n", sizeof(int));
    printf("sizeof(long) %i\n", sizeof(long));
    printf("sizeof(long long) %i\n\n", sizeof(long long));

    verify_type(-2147483647);
    verify_type(-2147483648);

    getchar();
    return 0; …
Run Code Online (Sandbox Code Playgroud)

c++ types long-integer

3
推荐指数
3
解决办法
663
查看次数

无法从CPython读取大量(20GB)文件

我有一些我无法理解的CPython问题.这一切都归结为使用相同的代码来读取小文本文件但无法读取20GB txt文件中的单行这一事实.

一些有用的信息:

  • 较小的文件~1MB是20GB大文件的一个子集(从1MB开始)
  • 这两个文件都是文本文件,行宽为~2000chars,由CR(\ r)分隔

明显的解决方案:

f = open(r'filename', 'r')
for line in f:
    print(line)
f.close()
Run Code Online (Sandbox Code Playgroud)

有效......但是......仅供短文件使用.因为大的人永远挂起(或者至少应该打印至少第一行).

所以我想至少尝试读一行如下:

f = open(r'filename', 'r')
print(f.readline())
f.close()
Run Code Online (Sandbox Code Playgroud)

类似的情况在这里 - 适用于小文件,但是对于大文件,经过大量时间吐出该消息:

Traceback (most recent call last):
  File "***", line 16, in <module>
    print(f.readline())
SystemError: ..\Objects\stringobject.c:3902: bad argument to internal function
Run Code Online (Sandbox Code Playgroud)

我应该怎么读一个大文本文件?

更新:

原来人类认为更清楚,有足够的睡眠;-).问题解决了 - 结果我忽略了文档中的一句话:

Python通常使用通用换行符支持构建; 提供'U'将文件作为文本文件打开,但行可以通过以下任何一种方式终止:Unix行尾约定'\n',Macintosh约定'\ r'或Windows约定'\ r\N".

只是认为通用换行符默认为"开启".

我的上述说法:

print(f.readline())
Run Code Online (Sandbox Code Playgroud)

只读一行是部分错误(我的坏).记得我说我的小文件是通过大块的大块创建的吗?在那个操作过程中,行结束从(CR)变为(CRLF),所以我看到的是第一行.所有这些让我觉得这个问题不在线.

谢谢大家的时间和帮助.

python io file

2
推荐指数
1
解决办法
355
查看次数

JFileChooser>"查看"奇怪的名字

我有一个在Win7上使用JFileChooser的java应用程序.奇怪的是,有时(经常)但并不总是 - 驱动器名称在"Look in:"组合框中看起来很奇怪:

在此输入图像描述

有没有人知道是什么原因以及如何使它始终显示正确的名称?

java jfilechooser

2
推荐指数
1
解决办法
188
查看次数