Что должно выполняться по стандарту Си?
От: lis_asm  
Дата: 23.11.19 21:29
Оценка:
Доброе время суток! Надеюсь, хоть и сомневаюсь, что тут найдутся знатоки стандарта Си(++). Суть вопроса в следующем. Пусть pointer — указатель, скажем, на char. рассмотрим такую конструкцию:
if (pointer && *pointer)
{
...
}

Т.е. мы проверяем корректность указателя на строку, проверяем не пустая ли она, и потом что-то делаем. По стандарту определены порядок выполнения операция слева направо, а так же приоритет. Данная конструкция скомпилится в нечто подобное:

cmp pointer,0
jz m1
mov rax,pointer
cmp byte ptr [rax],0
jz m1
........
m1:

И так на всех компиляторах и платформах, которые мне встречались. Однако, прописано ли явно в стандарте, что второй аргумент && не должен вычисляться? Т.е. если попытка чтения по указателю таки будет выполнена, а потом выполнится &&, это будет противоречить стандартам?

Приведу еще аналогичный случай.

int a = 10;
int b = 20;
int c = 0 ? ++a : ++b;

После выполнения виденными мной компиляторами a == 10, b == 21, c == 21. Однако обязан ли компилятор не выполнять выражение ++a ? Т.е. если результат a == 11, b == 21, c == 21, это правильно с точки зрения стандарта языка?
Отредактировано 23.11.2019 21:55 lis_asm . Предыдущая версия . Еще …
Отредактировано 23.11.2019 21:42 lis_asm . Предыдущая версия .
Отредактировано 23.11.2019 21:39 lis_asm . Предыдущая версия .
си стандарт приоритет
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.